(Arne Babenhauserheide)
2014-08-19: try at implementing (a #{.}# b) -> (a . b), does not work, yet. try at implementing (a #{.}# b) -> (a . b), does not work, yet.
diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -40,9 +40,14 @@ define : line-real-indent line
define : line-code line
cdr line
+; literal values I need
+define readcolon
+ call-with-input-string ":" read
+define readdot
+ call-with-input-string "." read
+
define : line-continues? line
- let : : readdot : call-with-input-string "." read
- equal? readdot : car : line-code line
+ equal? readdot : car : line-code line
define : line-only-colon? line
and
@@ -241,8 +246,6 @@ define : line-prepend-n-parens n line
. '("(")
cdr l
-define readcolon
- call-with-input-string ":" read
define : line-code-replace-inline-colons line
' "Replace inline colons by opening parens which close at the end of the line"
@@ -431,12 +434,75 @@ define : wisp-scheme-strip-indentation-m
append processed : cdr : car unprocessed
cdr unprocessed
+define : wisp-scheme-recreate-incomeplete-lists expressions
+ . "Turn (a #{.}# b) into the correct (a . b).
+
+read called on a single dot creates a variable named #{.}# (|.|
+in r7rs). Due to parsing the indentation before the list
+structure is known, the reader cannot create incomplete lists
+when it reads a dot. So we have to take another pass over the
+code to recreate the incomplete lists.
+
+Traverse each list and sublist backwards, and if it contains a
+readdot, cons every element in the list on the last element.
+
+TODO: Find out how I can do that, when the second element is a
+function call (a list). Problem: (cons 1 '(2)) -> '(1 2).
+
+TODO: Find out whether this would actually be legal scheme code.
+ (write (1 . (+ 1 2))) -> error
+ (write . (+ 1 2)) -> strange
+ (write (list 1 . (+ 1 2))) -> (1 #<procedure + (#:optional _ _ . _)> 1 2) ???
+ (list 1 . (list 2 3)) -> (1 #<procedure list _> 2 3)
+ (list . (list 2 3)) -> (#<procedure list _> 2 3) == (list list 2 3)"
+ ; FIXME: Implement recreating incomplete lists!
+ let loop
+ : processed '()
+ unprocessed-reversed expressions
+ cond
+ : null? unprocessed-reversed
+ . processed
+ : not : list? unprocessed-reversed
+ ; FIXME: This requires unlimited amounts of memory.
+ cons unprocessed-reversed processed
+ : not : member readdot unprocessed-reversed
+ cond
+ : list? : car unprocessed-reversed
+ loop
+ cons
+ loop '() : car unprocessed-reversed
+ . processed
+ . unprocessed-reversed
+ else
+ loop
+ cons (car unprocessed-reversed) processed
+ cdr unprocessed-reversed
+ else ; cons unprocessed on its tail
+ let conser
+ : proc-reversed : car unprocessed-reversed
+ unproc : cdr unprocessed-reversed
+ cond
+ : null? unproc
+ ; back to the main loop
+ loop
+ . processed
+ . proc-reversed
+ : equal? readdot : car unproc ; just skip the dot. It is why we cons.
+ conser
+ . proc-reversed
+ cdr unproc
+ else
+ conser
+ cons (car unproc) proc-reversed
+ cdr unproc
define : wisp-scheme-read-chunk port
. "Read and parse one chunk of wisp-code"
let : : lines : wisp-scheme-read-chunk-lines port
; display lines
; newline
+ ; FIXME: incmoplete list recreation does not work yet
+ ; wisp-scheme-recreate-incomeplete-lists
wisp-scheme-indentation-to-parens lines
define : wisp-scheme-read-all port
@@ -461,9 +527,32 @@ define : wisp-scheme-read-string str
call-with-input-string str wisp-scheme-read-all
+; TODO: Recreate incomplete lists.
write
- wisp-scheme-read-string "foo ; bar\n ; nop \n\n; nup\n; nup \n \n\n\nfoo : moo \"\n\" \n___ . goo . hoo"
+ wisp-scheme-read-string "foo . bar"
newline
+write
+ wisp-scheme-read-string "foo .
+ . bar"
+newline
+write
+ wisp-scheme-read-string "foo
+ . . bar"
+newline
+write
+ wisp-scheme-read-string "moo
+ foo
+ . . bar
+baz waz"
+newline
+; systax error
+write
+ wisp-scheme-read-string "foo .
+ . . bar"
+newline
+; write
+; wisp-scheme-read-string "foo ; bar\n ; nop \n\n; nup\n; nup \n \n\n\nfoo : moo \"\n\" \n___ . goo . hoo"
+; newline
; display
; wisp-scheme-read-string " foo ; bar\n ; nop \n\n; nup\n; nup \n \n\n\nfoo : moo"
; newline
@@ -471,11 +560,11 @@ newline
; newline
; run all chunks in wisp-guile.w as parsed by wisp-scheme.w. Give wisp-guile.w to parse as argument.
; map primitive-eval : wisp-scheme-read-file "wisp-guile.w"
-call-with-output-file "wisp-guile.scm"
- lambda : port
- map
- lambda : chunk
- write chunk port
- wisp-scheme-read-file "wisp-guile.w"
+; call-with-output-file "wisp-guile.scm"
+; lambda : port
+; map
+; lambda : chunk
+; write chunk port
+; wisp-scheme-read-file "wisp-guile.w"
; pipe the output into 1, then compare it with the output of wisp.scm. If it is equal, this parser works!
; guile wisp.scm wisp-scheme.w > wisp-scheme.scm; guile wisp-scheme.scm wisp-guile.w > 1; guile wisp.scm wisp-guile.w > 2; diff 1 2