(Arne Babenhauserheide)
2014-11-01: move the special syntax logic from the loop into a wrapper for read. move the special syntax logic from the loop into a wrapper for read.
diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -59,25 +59,71 @@ define repr-quote ; '
string->symbol : string-append "REPR-QUOTE-" wisp-uuid
define repr-unquote ; ,
string->symbol : string-append "REPR-UNQUOTE-" wisp-uuid
+define repr-quasiquote ; `
+ string->symbol : string-append "REPR-QUASIQUOTE-" wisp-uuid
define repr-unquotesplicing ; ,@
string->symbol : string-append "REPR-UNQUOTESPLICING-" wisp-uuid
-define repr-quasiquote ; `
- string->symbol : string-append "REPR-QUASIQUOTE-" wisp-uuid
define repr-syntax ; #'
string->symbol : string-append "REPR-SYNTAX-" wisp-uuid
define repr-unsyntax ; #,
string->symbol : string-append "REPR-UNSYNTAX-" wisp-uuid
+define repr-quasisyntax ; #`
+ string->symbol : string-append "REPR-QUASISYNTAX-" wisp-uuid
define repr-unsyntaxsplicing ; #,@
string->symbol : string-append "REPR-UNSYNTAXSPLICING-" wisp-uuid
-define repr-quasisyntax ; #`
- string->symbol : string-append "REPR-QUASISYNTAX-" wisp-uuid
; TODO: wrap the reader to return the repr of the syntax reader
; additions
-define : wisp-read-linestart port
- . #f
+define : match-charlist-to-repr charlist
+ case : reverse charlist ; it is created via cons, so the last item is first.
+ : list #\.
+ . repr-dot
+ : list #\'
+ . repr-quote
+ : list #\,
+ . repr-unquote
+ : list #\`
+ . repr-quasiquote
+ : list #\, #\@
+ . repr-unquotesplicing
+ : list #\# #\'
+ . repr-syntax
+ : list #\# #\,
+ . repr-unsyntax
+ : list #\# #\`
+ . repr-quasisyntax
+ : list #\# #\, #\@
+ . repr-unsyntaxsplicing
+ else
+ . #f
+
+define : wisp-read port
+ let longpeek
+ : peeked '()
+ repr-symbol #f
+ cond
+ : or (equal? #\space (peek-char port)) (equal? #\newline (peek-char port)) (equal? #\( (peek-char port))
+ if repr-symbol ; found a special symbol, return it.
+ . repr-symbol
+ let unpeek
+ : remaining peeked
+ cond
+ : equal? '() remaining
+ read port ; let read to the work
+ else
+ unread-char (car remaining) port
+ unpeek : cdr remaining
+ else
+ let*
+ : next-char : read-char port
+ peeked : cons next-char peeked
+ longpeek
+ . peeked
+ match-charlist-to-repr peeked
+
+
define : line-continues? line
equal? repr-dot : car : line-code line
@@ -252,32 +298,6 @@ define : wisp-scheme-read-chunk-lines po
. currentindent
. currentsymbols
. emptylines
- : equal? (string-ref "." 0) next-char
- ; TODO: special case for the dot using the repr-dot as
- ; intermediate representation
- read-char port ; remove next-char
- let : : next-next-char : peek-char port
- ; if we don’t need the special handling, add the
- ; next char to the port again
- if : not : or (equal? #\space next-next-char) (equal? #\newline next-next-char) (eof-object? next-next-char) (equal? #\return next-next-char)
- unread-char next-char port
- loop
- . indent-and-symbols
- . #f ; inindent
- . #f ; inunderscoreindent
- . #f ; incomment
- . currentindent
- ; this also takes care of the hashbang and leading comments.
- append currentsymbols
- ; if we don’t need the special handling, just
- ; use the reader. Otherwise append the special
- ; representation of the dot to avoid triggering
- ; this for the dot escaped as |.| or #{.}#
- if : not : or (equal? #\space next-next-char) (equal? #\newline next-next-char) (eof-object? next-next-char) (equal? #\return next-next-char)
- list : read port
- list repr-dot
- . emptylines
- ; TODO: finish
else ; use the reader
loop
. indent-and-symbols
@@ -287,7 +307,7 @@ define : wisp-scheme-read-chunk-lines po
. currentindent
; this also takes care of the hashbang and leading comments.
; TODO: If used from Guile, activate curly infix via read-options.
- append currentsymbols : list : read port
+ append currentsymbols : list : wisp-read port
. emptylines