wisp
 
(Arne Babenhauserheide)
2014-10-15: FIX: avoid mistaking #{.}# for a dot with syntactic meaning by

FIX: avoid mistaking #{.}# for a dot with syntactic meaning by special casing reading for single dots sourrounded by whitespace.

diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -48,20 +48,14 @@ define : line-code line
 ; literal values I need
 define readcolon 
        string->symbol ":"
-define readdot
-       string->symbol "."
-; TODO: define an intermediate dot replacement with UUID
-; ensure that we get real randomness.
-set! *random-state* : random-state-from-platform
+
+; define an intermediate dot replacement with UUID to avoid clashes.
 define dotrepr 
-       string->symbol
-           string-append "DOTREPR-"
-               number->string 
-                   random : expt 2 16
+       string->symbol "DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd"
 
 
 define : line-continues? line
-         equal? readdot : car : line-code line
+         equal? dotrepr : car : line-code line
 
 define : line-only-colon? line
          and
@@ -225,15 +219,31 @@ define : wisp-scheme-read-chunk-lines po
                    . currentindent
                    . currentsymbols
                    . emptylines
-               : and inindent : equal? (string-ref "." 0) next-char
+               : equal? (string-ref "." 0) next-char
                  ; TODO: special case for the dot using the dotrepr as
                  ; intermediate representation
                  read-char port ; remove next-char
                  let : : next-next-char : peek-char port
-                   if : not : equal? #\space next-next-char
-                     ; use the reader
-                     ; add the next char to the port again
+                   ; 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) (equal? #\return next-next-char) (eof-object? 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) (equal? #\return next-next-char) (eof-object? next-next-char)
+                         list : read port
+                         list dotrepr
+                     . emptylines
                      ; TODO: finish 
                else ; use the reader
                  loop 
@@ -445,52 +455,52 @@ when it reads a dot. So we have to take 
 code to recreate the improper lists.
 
 Match is awesome!"
-      let 
-        : 
-          improper
-            match code
-               : a ... b '#{.}# c
-                 append (map wisp-make-improper a) 
-                   cons (wisp-make-improper b) (wisp-make-improper c)
+         let 
+           : 
+             improper
+               match code
+                  : a ... b 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd c
+                    append (map wisp-make-improper a) 
+                      cons (wisp-make-improper b) (wisp-make-improper c)
+                  : a ...
+                    map wisp-make-improper a
+                  a
+                    . a
+           define : syntax-error li
+                   throw 'wisp-syntax-error (format #f "incorrect dot-syntax #{.}# in code: not a proper pair: ~A" li)
+           let check
+             : tocheck improper
+             match tocheck
+               ; lists with only one member
+               : 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd
+                 syntax-error tocheck
+               ; list with remaining dot.
                : a ...
-                 map wisp-make-improper a
+                 if : member dotrepr a
+                      syntax-error tocheck
+                      map check a
+               ; simple pair
+               : 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd . c
+                 syntax-error tocheck
+               ; simple pair, other way round
+               : a . 'DOTREPR-e749c73d-c826-47e2-a798-c16c13cb89dd
+                 syntax-error tocheck
+               ; more complex pairs
+               : ? pair? a
+                 let 
+                   : head : drop-right a 1
+                     tail : last-pair a
+                   cond
+                    : equal? dotrepr : car tail
+                      syntax-error tocheck
+                    : equal? dotrepr : cdr tail
+                      syntax-error tocheck
+                    : member dotrepr head
+                      syntax-error tocheck
+                    else
+                      . a
                a
                  . a
-        define : syntax-error li
-                throw 'wisp-syntax-error (format #f "incorrect dot-syntax #{.}# in code: not a proper pair: ~A" li)
-        let check
-          : tocheck improper
-          match tocheck
-            ; lists with only one member
-            : '#{.}#
-              syntax-error tocheck
-            ; list with remaining dot.
-            : a ...
-              if : member readdot a
-                   syntax-error tocheck
-                   map check a
-            ; simple pair
-            : '#{.}# . c
-              syntax-error tocheck
-            ; simple pair, other way round
-            : a . '#{.}#
-              syntax-error tocheck
-            ; more complex pairs
-            : ? pair? a
-              let 
-                : head : drop-right a 1
-                  tail : last-pair a
-                cond
-                 : equal? readdot : car tail
-                   syntax-error tocheck
-                 : equal? readdot : cdr tail
-                   syntax-error tocheck
-                 : member readdot head
-                   syntax-error tocheck
-                 else
-                   . a
-            a
-              . a
 
 
 define : wisp-scheme-read-chunk port