(Arne Babenhauserheide)
2014-10-25: wisp-scheme: Prepare using line prefixes as paren prefixes: ' , ,@ ` wisp-scheme: Prepare using line prefixes as paren prefixes: ' , ,@ ` #' #` #, #,@
diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -49,13 +49,34 @@ define : line-code line
define readcolon
string->symbol ":"
+define wisp-uuid "e749c73d-c826-47e2-a798-c16c13cb89dd"
; define an intermediate dot replacement with UUID to avoid clashes.
-define dotrepr
- string->symbol "DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd"
+define repr-dot ; .
+ string->symbol : string-append "REPR-DOT-" wisp-uuid
+; allow using reader additions as the first element on a line to prefix the list
+define repr-quote ; '
+ string->symbol : string-append "REPR-QUOTE-" wisp-uuid
+define repr-unquote ; ,
+ string->symbol : string-append "REPR-UNQUOTE-" 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-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
define : line-continues? line
- equal? dotrepr : car : line-code line
+ equal? repr-dot : car : line-code line
define : line-only-colon? line
and
@@ -228,7 +249,7 @@ define : wisp-scheme-read-chunk-lines po
. currentsymbols
. emptylines
: equal? (string-ref "." 0) next-char
- ; TODO: special case for the dot using the dotrepr as
+ ; 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
@@ -250,7 +271,7 @@ define : wisp-scheme-read-chunk-lines po
; 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 dotrepr
+ list repr-dot
. emptylines
; TODO: finish
else ; use the reader
@@ -467,7 +488,7 @@ Match is awesome!"
:
improper
match code
- : a ... b 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd c
+ : a ... b 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd c
append (map wisp-make-improper a)
cons (wisp-make-improper b) (wisp-make-improper c)
: a ...
@@ -480,18 +501,18 @@ Match is awesome!"
: tocheck improper
match tocheck
; lists with only one member
- : 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd
+ : 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd
syntax-error tocheck
; list with remaining dot.
: a ...
- if : member dotrepr a
+ if : member repr-dot a
syntax-error tocheck
map check a
; simple pair
- : 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd . c
+ : 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd . c
syntax-error tocheck
; simple pair, other way round
- : a . 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd
+ : a . 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd
syntax-error tocheck
; more complex pairs
: ? pair? a
@@ -499,11 +520,11 @@ Match is awesome!"
: head : drop-right a 1
tail : last-pair a
cond
- : equal? dotrepr : car tail
+ : equal? repr-dot : car tail
syntax-error tocheck
- : equal? dotrepr : cdr tail
+ : equal? repr-dot : cdr tail
syntax-error tocheck
- : member dotrepr head
+ : member repr-dot head
syntax-error tocheck
else
. a