wisp
 
(Arne Babenhauserheide)
2014-08-17: Finished basic indentation parsing.

Finished basic indentation parsing.

diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -40,6 +40,40 @@ define : line-empty? line
            = 0 : line-indent line
            line-empty-code? line
 
+define : line-strip-continuation line   
+         if : line-continues? line
+              list 
+                line-indent line
+                cdr : line-code line
+              . line
+
+define : indent-level-reduction indentation-levels level select-fun
+         . "Reduce the INDENTATION-LEVELS to the given LEVEL and return the value selected by SELECT-FUN"
+         let loop 
+           : newlevels indentation-levels
+             diff 0
+           cond
+             : = level : car newlevels
+               select-fun : list diff indentation-levels
+             : < level : car newlevels
+               loop
+                 cdr newlevels
+                 1- diff
+             else
+               throw 'wisp-syntax-error "Level ~A not found in the indentation-levels ~A."
+
+define : indent-level-difference indentation-levels level
+         . "Find how many indentation levels need to be popped off to find the given level."
+         indent-level-reduction indentation-levels level
+           lambda : x ; get the count
+                    car x
+
+define : indent-reduce-to-level indentation-levels level
+         . "Find how many indentation levels need to be popped off to find the given level."
+         indent-level-reduction indentation-levels level
+           lambda : x ; get the levels
+                    car : cdr x
+
 
 define : wisp-scheme-read-chunk-lines port
          let loop
@@ -211,7 +245,7 @@ define : wisp-indentation-to-parens line
                        list
                          line-append-n-parens 
                            1- : length indentation-levels
-                           . current-line
+                           line-strip-continuation current-line
                      . '() ; current-line empty: required end condition 1
                      . '() ; unprocessed empty: required end condition 2
                      . '() ; indentation-levels: There is nothing more to process
@@ -222,7 +256,7 @@ define : wisp-indentation-to-parens line
                          line-prepend-n-parens 1 
                            line-append-n-parens
                              length indentation-levels
-                             . current-line
+                             line-strip-continuation current-line
                      . '() ; current-line empty: required end condition 1
                      . '() ; unprocessed empty: required end condition 2
                      . '() ; indentation-levels: There is nothing more to process
@@ -246,21 +280,17 @@ define : wisp-indentation-to-parens line
                        cdr unprocessed
                        . indentation-levels
                    : = (line-indent current-line) (line-indent next-line)
-                     if : line-continues? current-line ; no parens needed
-                          loop
-                            append processed : list current-line
-                            . next-line
-                            cdr unprocessed
-                            . indentation-levels
-                          loop
-                            append processed 
-                              list 
-                                line-prepend-n-parens 1 
-                                  line-append-n-parens 1 
-                                    . current-line
-                            . next-line
-                            cdr unprocessed
-                            . indentation-levels
+                     let 
+                       : parens-to-add : if (line-continues? current-line) 0 1
+                       loop
+                         append processed 
+                           list 
+                             line-prepend-n-parens parens-to-add
+                               line-append-n-parens parens-to-add
+                                 line-strip-continuation current-line
+                         . next-line
+                         cdr unprocessed
+                         . indentation-levels
                    : < (line-indent current-line) (line-indent next-line)
                      if : line-continues? current-line
                           ; this is a syntax error.
@@ -270,14 +300,36 @@ define : wisp-indentation-to-parens line
                             append processed 
                               list
                                 line-prepend-n-parens 1 
-                                  . current-line
+                                  line-strip-continuation current-line
                             . next-line
                             cdr unprocessed
                             ; we need to add an indentation level for the next-line.
                             cons (line-indent next-line) indentation-levels
+                   : > (line-indent current-line) (line-indent next-line)
+                     ; first we need to find out how many indentation levels we need to pop.
+                     let*
+                       : newlevels : indent-reduce-to-level indentation-levels : line-indent next-line
+                         level-difference : indent-level-difference indentation-levels : line-indent next-line
+                         parens-to-prepend 
+                           if : line-continues? current-line
+                                . 1
+                                . 0
+                         parens-to-append 
+                           if : line-continues? current-line
+                                . level-difference
+                                1+ level-difference
+                       loop
+                         append processed 
+                           list
+                             line-prepend-n-parens parens-to-prepend
+                               line-append-n-parens parens-to-append
+                                 line-strip-continuation current-line
+                         . next-line
+                         cdr unprocessed
+                         . newlevels
                    else
                      throw 'wisp-not-implemented 
-                           format #f "Need to implement further line comparison: current: ~A, next: ~A, processed: ~A"
+                           format #f "Need to implement further line comparison: current: ~A, next: ~A, processed: ~A."
                              . current-line next-line processed
              
              
@@ -285,9 +337,7 @@ define : wisp-indentation-to-parens line
 
 define : wisp-scheme-read-chunk port
          . "Read and parse one chunk of wisp-code"
-         let : : lines : wisp-scheme-read-chunk-lines port
-             ; TODO: process indentation.
-             wisp-indentation-to-parens lines
+         wisp-indentation-to-parens : wisp-scheme-read-chunk-lines port
 
 define : wisp-scheme-read-all port
          . "Read all chunks from the given port"
@@ -298,7 +348,8 @@ define : wisp-scheme-read-all port
                ; TODO: Join as string.
                . tokens
              else
-               append tokens : wisp-scheme-read-chunk port
+               loop
+                 append tokens : wisp-scheme-read-chunk port
 
 define : wisp-scheme-read-file path
          call-with-input-file path wisp-scheme-read-all
@@ -310,11 +361,9 @@ define : wisp-scheme-read-string str
 display  
   wisp-scheme-read-string  "  foo ; bar\n  ; nop \n\n; nup\n; nup \n  \n\n\n  foo : moo \"\n\" \n___ . goo . hoo"
 newline 
-display : wisp-scheme-read-file "wisp-scheme.w"
-newline 
+; display : wisp-scheme-read-file "wisp-scheme.w"
+; newline 
 ; This correctly throws an error.
 ; display
 ;   wisp-scheme-read-string  "  foo \n___. goo . hoo"
 ; newline
-
-