(Arne Babenhauserheide)
2014-08-17: implemented the recursion stop of the wisp indentation reader. implemented the recursion stop of the wisp indentation reader.
diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -157,6 +157,81 @@ define : wisp-scheme-read-chunk-lines po
append currentsymbols : list : read port
. emptylines
+define : line-append-n-parens n line
+ . "Append N parens at the end of the line"
+ let loop : (rest n) (l line)
+ cond
+ : = 0 rest
+ . l
+ else
+ loop (1- rest) (append l '(")"))
+
+define : line-prepend-n-parens n line
+ . "Prepend N parens at the beginning of the line, but after the indentation-marker"
+ let loop : (rest n) (l line)
+ cond
+ : = 0 rest
+ . l
+ else
+ loop
+ 1- rest
+ append
+ list : car l
+ '("(")
+ cdr l
+
+; TODO: process inline colons
+
+define : wisp-indentation-to-parens lines
+ . "Add parentheses to lines and remove the indentation markers"
+ let loop
+ : processed '()
+ current-line : car lines
+ unprocessed : cdr lines
+ indentation-levels '(0)
+ cond
+ ; the recursion end-condition
+ : and (null? current-line) (null? unprocessed) (not (null? indentation-levels))
+ throw 'wisp-programming-error "The current-line is null but there are indentation-levels: Something returned a broken line as new current-line."
+ : and (not (null? current-line)) (null? indentation-levels)
+ throw 'wisp-programming-error "The indentation-levels are null but the current-line is null: Something killed the indentation-levels."
+ ; the recursion end-condition
+ : and (null? current-line) (null? unprocessed)
+ . processed
+ ; now care for the last step
+ : null? unprocessed
+ ; current is the last line
+ cond
+ : line-continues? current-line
+ loop
+ append processed
+ list
+ line-append-n-parens
+ 1- : length indentation-levels
+ current-line
+ '() ; current-line empty: required end condition 1
+ '() ; no unprocessed: required end condition 2
+ '() ; indentation-levels: There is nothing more to process
+ else
+ loop
+ append processed
+ list
+ line-append-n-parens
+ length indentation-levels
+ current-line
+ '() ; current-line empty: required end condition 1
+ '() ; no unprocessed: required end condition 2
+ '() ; indentation-levels: There is nothing more to process
+ else ; now we come to the line-comparisons and indentation-counting.
+ let*
+ : next-line : car unprocessed
+ cond
+ else
+ throw 'wisp-not-implemented "Still need to implement the real comparisons."
+
+
+
+
define : wisp-scheme-read-chunk port
. "Read and parse one chunk of wisp-code"
let : : lines : wisp-scheme-read-chunk-lines port