wisp
 
(Arne Babenhauserheide)
2014-09-02: added full error handling.

added full error handling.

diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -426,7 +426,10 @@ when it reads a dot. So we have to take 
 code to recreate the improper lists.
 
 Match is awesome!"
-         match code
+      let 
+        : 
+          improper
+            match code
                : a ... b '#{.}# c
                  append (map wisp-make-improper a) 
                    cons (wisp-make-improper b) (wisp-make-improper c)
@@ -434,6 +437,46 @@ Match is awesome!"
                  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
+            : '#{.}#
+              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
+            : a '#{.}# . c
+              syntax-error tocheck
+            : ? 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
+              ; if : member readdot a
+              ;      syntax-error
+              ;      map check a
+            a
+              . a
 
 
 define : wisp-scheme-read-chunk port
@@ -481,7 +524,7 @@ newline
 write
   wisp-scheme-read-string  "moo
   foo
-    . . bar
+    . . bar baz
 baz waz"
 newline 
 ; systax error