(Arne Babenhauserheide)
2014-05-02: add test-suite add test-suite
diff --git a/docs/srfi.org b/docs/srfi.org --- a/docs/srfi.org +++ b/docs/srfi.org @@ -347,7 +347,917 @@ You can still use underscores anywhere b The wisp test-suite consists of a large number of wisp-snippets and the corresponding scheme-code. A wisp-implementation may call itself compliant to the wisp test-suite if it successfully converts each wisp-snippet into the corresponging scheme-snippet. Blank lines at the end of the file do not matter for this purpose. +** tests/syntax-underscore.w +#+begin_src wisp +define : a b c +_ d e +___ f +___ g h +__ . i +define : _ +_ display "hello\n" + +\_ +#+end_src +** tests/syntax-underscore.scm +#+begin_src scheme +(define (a b c) + (d e + (f) + (g h) + i)) + +(define (_) + (display "hello\n")) + +(_) + + +#+end_src +** tests/syntax-strings-parens.w +#+begin_src wisp +; Test linebreaks in strings and brackets + +. "flubbub + +flabbab" + +hrug (nadda +madda gadda "shoktom + mee" " sep +ka" + hadda) + gom + +flu + +sum [foo +bar] barz {1 + [* 2 2]} + +mara { +li ++ +lo (mabba) +} +#+end_src +** tests/syntax-strings-parens.scm +#+begin_src scheme +; Test linebreaks in strings and brackets + +"flubbub + +flabbab" + +(hrug (nadda +madda gadda "shoktom + mee" " sep +ka" + hadda) + (gom)) + +(flu) + +(sum [foo +bar] barz {1 + [* 2 2]}) + +(mara { +li ++ +lo (mabba) +}) +#+end_src +** tests/syntax-indent.w +#+begin_src wisp +define + hello who + format #t "Hello ~A\n" who + +define + let + : + a 1 + b 2 + c 3 + format #t "a: ~A, b: ~A, c: ~A" + + a 2 + . b c + +#+end_src +** tests/syntax-indent.scm +#+begin_src scheme +(define + (hello who) + (format #t "Hello ~A\n" who)) + +(define + (let + ( + (a 1) + (b 2) + (c 3)) + (format #t "a: ~A, b: ~A, c: ~A" + (+ a 2) + b c))) + + + +#+end_src +** tests/syntax-empty.w +#+begin_src wisp +#+end_src +** tests/syntax-empty.scm +#+begin_src scheme +#+end_src +** tests/syntax-dot.w +#+begin_src wisp +define : foo + . "bar" + +define : bar + ' 1 + . . 2 ; pair + +display : foo +newline +display : bar +newline +#+end_src +** tests/syntax-dot.scm +#+begin_src scheme +(define (foo) + "bar") + +(define (bar) + '(1 + . 2 )); pair + +(display (foo)) +(newline) +(display (bar)) +(newline) + + +#+end_src +** tests/syntax-colon.w +#+begin_src wisp +let + : + a 1 + b 2 + let + : + : + . c 3 + format #t "a: ~A, b: ~A, c: ~A" + . a b c + +: a + +define : hello + display "hello\n" + +let + : a 1 + b 2 + format #t "a: ~A, b: ~A" + . a b + +let : : a ' : + +let + : ; foo + a + ' + +: + a + +define : \: + hello + +\: +#+end_src +** tests/syntax-colon.scm +#+begin_src scheme +(let + ( + (a 1) + (b 2)) + (let + ( + ( + c 3)) + (format #t "a: ~A, b: ~A, c: ~A" + a b c))) + +((a)) + +(define (hello) + (display "hello\n")) + +(let + ((a 1) + (b 2)) + (format #t "a: ~A, b: ~A" + a b)) + +(let ((a '()))) + +(let + ( ; foo + (a + '()))) + +( + (a)) + +(define (:) + (hello)) + +(:) + + +#+end_src +** tests/sublist.w +#+begin_src wisp +; sublists allow to start single line function calls with a colon ( : ). +; +defun a : b c + let : : e . f + . g +#+end_src +** tests/sublist.scm +#+begin_src scheme +; sublists allow to start single line function calls with a colon ( : ). + +(defun a (b c) + (let ((e . f))) + g) + + +#+end_src +** tests/shebang.w +#+begin_src wisp +#!/usr/bin/wisp.py # !# +; This tests shebang lines +#+end_src +** tests/shebang.scm +#+begin_src scheme +#!/usr/bin/wisp.py # !# +; This tests shebang lines + + +#+end_src +** tests/readable-tests.w +#+begin_src wisp +define : fibfast n + if : < n 2 + . n + fibup n 2 1 0 + +define : fibup maxnum count n-1 n-2 + if : = maxnum count + + n-1 n-2 + fibup maxnum + + count 1 + + n-1 n-2 + . n-1 + +define : factorial n + if : <= n 1 + . 1 + * n + factorial : - n 1 + +define (gcd x y) + if (= y 0) + . x + gcd y + rem x y + +define : add-if-all-numbers lst + call/cc + lambda : exit + let loop + : + lst lst + sum 0 + if : null? lst + . sum + if : not : number? : car lst + exit #f + + : car lst + loop : cdr lst +#+end_src +** tests/readable-tests.scm +#+begin_src scheme +(define (fibfast n) + (if (< n 2)) + n + (fibup n 2 1 0 )) + +(define (fibup maxnum count n-1 n-2) + (if (= maxnum count) + (+ n-1 n-2) + (fibup maxnum + (+ count 1 ) + (+ n-1 n-2 ) + n-1))) + +(define (factorial n) + (if (<= n 1) + 1 + (* n + (factorial (- n 1))))) + +(define (gcd x y) + (if (= y 0)) + x + (gcd y + (rem x y))) + +(define (add-if-all-numbers lst) + (call/cc + (lambda (exit) + (let loop + ( + (lst lst ) + (sum 0)) + (if (null? lst) + sum + (if (not (number? (car lst))) + (exit #f) + (+ (car lst) + (loop (cdr lst))))))))) + +#+end_src +** tests/range.w +#+begin_src wisp +import : rnrs + +define range + case-lambda + : n ; one-argument syntax + range 0 n 1 + : n0 n ; two-argument syntax + range n0 n 1 + : n0 n s ; three-argument syntax + assert + and + for-all number? : list n0 n s + not : zero? s + let : : cmp : if (positive? s) >= <= + let loop + : i n0 + acc '() + if + cmp i n + reverse acc + loop (+ i s) (cons i acc) + +display : apply string-append "" : map number->string : range 5 +newline +#+end_src +** tests/range.scm +#+begin_src scheme +(import (rnrs)) + +(define range + (case-lambda + ((n ); one-argument syntax + (range 0 n 1)) + ((n0 n ); two-argument syntax + (range n0 n 1)) + ((n0 n s ); three-argument syntax + (assert + (and + (for-all number? (list n0 n s)) + (not (zero? s)))) + (let ((cmp (if (positive? s) >= <= ))) + (let loop + ((i n0 ) + (acc '())) + (if + (cmp i n ) + (reverse acc) + (loop (+ i s) (cons i acc)))))))) + +(display (apply string-append "" (map number->string (range 5)))) +(newline) + +#+end_src +** tests/quotecolon.w +#+begin_src wisp +#!/home/arne/wisp/wisp-multiline.sh +; !# +define a 1 ; test whether ' : correctly gets turned into '( +; and whether brackets in commments are treated correctly. + +define a ' : 1 2 3 + +define + a b + c +#+end_src +** tests/quotecolon.scm +#+begin_src scheme +#!/home/arne/wisp/wisp-multiline.sh +; !# +(define a 1 ); test whether ' : correctly gets turned into '( +; and whether brackets in commments are treated correctly. + +(define a '(1 2 3)) + +(define + (a b) + (c)) + + +#+end_src +** tests/namedlet.w +#+begin_src wisp +#!/home/arne/wisp/wisp-multiline.sh +; !# +define : hello who + display who + +let hello + : who 0 + if : = who 5 + display who + hello : + 1 who +#+end_src +** tests/namedlet.scm +#+begin_src scheme +#!/home/arne/wisp/wisp-multiline.sh +; !# +(define (hello who) + (display who)) + +(let hello + ((who 0)) + (if (= who 5) + (display who) + (hello (+ 1 who)))) + + +#+end_src +** tests/mtest.w +#+begin_src wisp +#!/home/arne/wisp/wisp-multiline.sh !# + +display 1 +#+end_src +** tests/mtest.scm +#+begin_src scheme +#!/home/arne/wisp/wisp-multiline.sh !# + +(display 1) + + +#+end_src +** tests/flexible-parameter-list.w +#+begin_src wisp +; Test using a . as first parameter on a line by prefixing it with a second . +define + a i + . . b + unless : >= i : length b + display : number->string : length b + display : list-ref b i + newline + apply a ( + i 1 ) b + + +a 0 "123" "345" "567" +#+end_src +** tests/flexible-parameter-list.scm +#+begin_src scheme +; Test using a . as first parameter on a line by prefixing it with a second . +(define + (a i + . b) + (unless (>= i (length b)) + (display (number->string (length b ))) + (display (list-ref b i)) + (newline) + (apply a ( + i 1 ) b))) + + +(a 0 "123" "345" "567") + + +#+end_src +** tests/factorial.w +#+begin_src wisp +;; short version +; note: once you use one inline colon, all the following forms on that +; line will get closed at the end of the line + +define : factorial n + if : zero? n + . 1 + * n : factorial : - n 1 + +display : factorial 5 + + +;; more vertical space, less colons +define : factorial n + if : zero? n + . 1 + * n + factorial + - n 1 + +display : factorial 5 + +#+end_src +** tests/factorial.scm +#+begin_src scheme +;; short version +; note: once you use one inline colon, all the following forms on that +; line will get closed at the end of the line + +(define (factorial n) + (if (zero? n) + 1 + (* n (factorial (- n 1))))) + +(display (factorial 5 )) + + +;; more vertical space, less colons +(define (factorial n) + (if (zero? n) + 1 + (* n + (factorial + (- n 1))))) + +(display (factorial 5 )) + + + +#+end_src +** tests/example.w +#+begin_src wisp +defun a (b c) + let + : + d "i am a string +do not break me!" + : + ; comment: 0 + f +; comment : 1 + ` g ; comment " : " 2 + : + h (I am in brackets: + do not : change "me") + . i + , ' j k + + . l + +; comment + + a c + +defun b : :n o + . "second defun : with a docstring!" + message "I am here" + . t + +defun c : e f + : g + : + h + i + j + ' : + k + . l + . : m + +defun _ : \: +__ +__ . \: + +\_ b + +defun d : + let + : a b + c d + +a : : : c + +let + : a b + c + +let : : a b + +. a + +#+end_src +** tests/example.scm +#+begin_src scheme +(defun a (b c) + (let + ( + (d "i am a string +do not break me!") + ( + ; comment: 0 + (f) +; comment : 1 + `(g )); comment " : " 2 + ( + (h (I am in brackets: + do not : change "me")) + i))) + ,(' j k) + + l + +; comment + + (a c)) + +(defun b (:n o) + "second defun : with a docstring!" + (message "I am here") + t) + +(defun c (e f) + ((g)) + ( + (h + (i)) + (j)) + '(()) + (k) + l + (m)) + +(defun _ (:) + + :) + +(_ b) + +(defun d () + (let + ((a b) + (c d)))) + +(a (((c)))) + +(let + ((a b) + (c))) + +(let ((a b))) + +a + + + +#+end_src +** tests/emacs-customization.w +#+begin_src wisp +if : file-directory-p "~/.emacs.d/private/journal/" + setq-default journal-dir "~/.emacs.d/private/journal/" + +global-set-key [(control meta .)] 'goto-last-change-reverse + +require 'org-latex +add-to-list 'org-export-latex-packages-alist + ' "" "minted" + +add-to-list 'org-export-latex-packages-alist + ' "" "color" + +setq org-export-latex-listings 'minted + +add-hook 'outline-mode-hook + lambda : + require 'outline-magic + + +defun find-file-as-root : + . "Like `ido-find-file, but automatically edit the file with +root-privileges (using tramp/sudo), if the file is not writable by +user." + interactive + let : : file : ido-read-file-name "Edit as root: " + unless : file-writable-p file + setq file : concat find-file-root-prefix file + find-file file + +defun find-current-as-root : + . "Reopen current file as root" + interactive + set-visited-file-name : concat find-file-root-prefix : buffer-file-name + setq buffer-read-only nil + +; the next function definition is equivalent, due to inline : + +defun find-current-as-root : + . "Reopen current file as root" + interactive + set-visited-file-name + concat find-file-root-prefix + buffer-file-name + setq buffer-read-only nil + +custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ' bbdb-complete-name-allow-cycling t + ' bbdb-ignore-some-messages-alist : quote : ("From" . "mailer-daemon") + ' bbdb-offer-save : quote savenoprompt + + +setq a "x" + . b "y" + . c "z" +#+end_src +** tests/emacs-customization.scm +#+begin_src scheme +(if (file-directory-p "~/.emacs.d/private/journal/") + (setq-default journal-dir "~/.emacs.d/private/journal/")) + +(global-set-key [(control meta .)] 'goto-last-change-reverse) + +(require 'org-latex) +(add-to-list 'org-export-latex-packages-alist + '("" "minted")) + +(add-to-list 'org-export-latex-packages-alist + '("" "color")) + +(setq org-export-latex-listings 'minted) + +(add-hook 'outline-mode-hook + (lambda () + (require 'outline-magic))) + + +(defun find-file-as-root () + "Like `ido-find-file, but automatically edit the file with +root-privileges (using tramp/sudo), if the file is not writable by +user." + (interactive) + (let ((file (ido-read-file-name "Edit as root: "))) + (unless (file-writable-p file) + (setq file (concat find-file-root-prefix file))) + (find-file file))) + +(defun find-current-as-root () + "Reopen current file as root" + (interactive) + (set-visited-file-name (concat find-file-root-prefix (buffer-file-name))) + (setq buffer-read-only nil)) + +; the next function definition is equivalent, due to inline : + +(defun find-current-as-root () + "Reopen current file as root" + (interactive) + (set-visited-file-name + (concat find-file-root-prefix + (buffer-file-name))) + (setq buffer-read-only nil)) + +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(bbdb-complete-name-allow-cycling t) + '(bbdb-ignore-some-messages-alist (quote (("From" . "mailer-daemon")))) + '(bbdb-offer-save (quote savenoprompt))) + + +(setq a "x" + b "y" + c "z") + +#+end_src +** tests/emacs-customization-tex-master.w +#+begin_src wisp +defun guess-TeX-master : filename + . "Guess the master file for FILENAME from currently open .tex files." + let + : + candidate nil + filename : file-name-nondirectory filename + save-excursion + dolist : buffer : buffer-list + with-current-buffer buffer + + let + : + name : buffer-name + file buffer-file-name + if + and file : string-match "\\.tex$" file + + progn + goto-char : point-min + if + re-search-forward + concat "\\\\input{" filename "}" + . nil t + setq candidate file + if + re-search-forward + concat "\\\\include{" (file-name-sans-extension filename) "}" + . nil t + setq candidate file + + if candidate + message "TeX master document: %s" : file-name-nondirectory candidate + . candidate +#+end_src +** tests/emacs-customization-tex-master.scm +#+begin_src scheme +(defun guess-TeX-master (filename) + "Guess the master file for FILENAME from currently open .tex files." + (let + ( + (candidate nil) + (filename (file-name-nondirectory filename))) + (save-excursion + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + + (let + ( + (name (buffer-name)) + (file buffer-file-name)) + (if + (and file (string-match "\\.tex$" file)) + + (progn + (goto-char (point-min)) + (if + (re-search-forward + (concat "\\\\input{" filename "}") + nil t) + (setq candidate file)) + (if + (re-search-forward + (concat "\\\\include{" (file-name-sans-extension filename) "}") + nil t) + (setq candidate file)))))))) + + (if candidate + (message "TeX master document: %s" (file-name-nondirectory candidate))) + candidate)) + + +#+end_src +** tests/continuation.w +#+begin_src wisp +a b c d e + . f g h + . i j k + +concat "I want " + getwish from me + . " - " username + +#+end_src +** tests/continuation.scm +#+begin_src scheme +(a b c d e + f g h + i j k) + +(concat "I want " + (getwish from me) + " - " username) + + + +#+end_src +** tests/btest.w +#+begin_src wisp +display "b" +newline +#+end_src +** tests/btest.scm +#+begin_src scheme +(display "b") +(newline) +#+end_src * Copyright