wisp
 
(Arne Babenhauserheide)
2014-08-15: the beginnings of a new, far simpler wisp reader which only works

the beginnings of a new, far simpler wisp reader which only works for scheme.

diff --git a/wisp-scheme.w b/wisp-scheme.w
new file mode 100755
--- /dev/null
+++ b/wisp-scheme.w
@@ -0,0 +1,76 @@
+#!/home/arne/wisp/wisp-multiline.sh
+; !#
+
+;; Scheme-only implementation of a wisp-preprocessor which output a
+;; scheme Tree IL to feed to a scheme interpreter instead of a
+;; preprocessed file.
+
+;; Plan:
+;; read reads the first expression from a string. It ignores comments,
+;; so we have to treat these specially. Our wisp-reader only needs to
+;; worry about whitespace.
+;; 
+;; So we can skip all the string and bracket linebreak escaping and
+;; directly create a list of codelines with indentation. For this we
+;; then simply reuse the appropriate function from the generic wisp
+;; preprocessor.
+
+define : wisp-scheme-reader port
+         let loop
+           : indent-and-symbols : list ; '((5 "(foobar)" "\"yobble\"")(3 "#t"))
+             inindent #t
+             incomment #f
+             currentindent 0
+             currentsymbols '()
+           cond
+             : eof-object? : peek-char port
+               append indent-and-symbols : list : append (list currentindent) currentsymbols
+             : and inindent : equal? #\space : peek-char port
+               read-char port ; remove char
+               loop 
+                 . indent-and-symbols
+                 . #t ; inindent
+                 . #f ; incomment
+                 1+ currentindent
+                 . currentsymbols
+             : equal? #\newline : peek-char port
+               read-char port ; remove the newline
+               loop
+                 append indent-and-symbols : list : append (list currentindent) currentsymbols
+                 . #t ; inindent
+                 . #f ; incomment
+                 . 0
+                 . '()
+             : equal? #t incomment
+               read-char port ; remove one comment character
+               loop 
+                 . indent-and-symbols
+                 . #f ; inindent 
+                 . #t ; incomment
+                 . currentindent
+                 . currentsymbols
+             : equal? #\space : peek-char port ; remove whitespace when not in indent
+               read-char port ; remove char
+               loop 
+                 . indent-and-symbols
+                 . #f ; inindent
+                 . #f ; incomment
+                 . currentindent
+                 . currentsymbols
+             : equal? (string-ref ";" 0) : peek-char port
+               loop 
+                 . indent-and-symbols
+                 . #f ; inindent 
+                 . #t ; incomment
+                 . currentindent
+                 . currentsymbols
+             else ; use the reader
+               loop 
+                 . indent-and-symbols
+                 . #f ; inindent
+                 . #f ; incomment
+                 . currentindent
+                 append currentsymbols : list : read port
+               
+
+display : call-with-input-string  "  (foo) ; bar\n  foo\n\n" wisp-scheme-reader