(Arne Babenhauserheide)
2013-09-13: YAY\! The reader works\! Wisp has a REPL\! — thanks go to Mark YAY\! The reader works\! Wisp has a REPL\! — thanks go to Mark Weaver and Nalaginrut\!
diff --git a/wisp-reader.w b/wisp-reader.w --- a/wisp-reader.w +++ b/wisp-reader.w @@ -23,28 +23,29 @@ (define (decompile-scheme x e opts) (values x e)) -(define internal-port-string "") +(define wisp-pending-port (make-object-property)) -(define internal-port (make-soft-port - (vector - (lambda (c) ; accept one char - (set! internal-port-string (string-append internal-port-string (string c)))) - (lambda (s) ; accept a string - (set! internal-port-string (string-append internal-port-string s))) - (lambda () #f) ; flush output - (lambda () ; get one char - (let ((c (string-char (string-take-right internal-port-string 1)))) - (set! internal-port-string (string-drop-right internal-port-string 1)) - c)) - (lambda () (set! internal-port-string "")) ; close the port - (lambda () (string-length internal-port-string))) - "rw")) - +; Code thanks to Mark Weaver +(define (read-one-wisp-sexp port env) + (define (read-wisp-chunk) + (let ((s (wisp2lisp (wisp-chunkreader port)))) + (display s) + (set! (wisp-pending-port port) + (open-input-string s)) + (try-pending))) + (define (try-pending) + (let ((pending-port (wisp-pending-port port))) + (if pending-port + (let ((x (read pending-port))) + (if (eof-object? x) + (read-wisp-chunk) + x)) + (read-wisp-chunk)))) + (try-pending)) (define-language wisp #:title "Wisp Scheme Syntax" - #:reader (lambda (port env) - (wisp2lisp (wisp-chunkreader port))) + #:reader read-one-wisp-sexp #:compilers `((scheme . ,compile-scheme)) #:decompilers `((scheme . ,decompile-scheme)) #:evaluator (lambda (x module) (primitive-eval x))