(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