(Arne Babenhauserheide)
2013-08-20: still errors, chars… still errors, chars…
diff --git a/wisp-guile.w b/wisp-guile.w
--- a/wisp-guile.w
+++ b/wisp-guile.w
@@ -146,8 +146,7 @@ define : line-merge-comment line
comment : line-comment line
if : equal? "" comment
. line ; no change needed
- list indent : string-append content ";" comment
- . ""
+ list indent (string-append content ";" comment) ""
; skip the leading indentation
define : skipindent inport
@@ -156,7 +155,7 @@ define : skipindent inport
indent 0
nextchar : read-char inport
; when the file ends, do not do anything else
- when : not : eof-object? nextchar
+ if : not : eof-object? nextchar
; skip underbars
if inunderbars
if : char=? nextchar #\_ ; still in underbars?
@@ -175,6 +174,7 @@ define : skipindent inport
begin
unread-char nextchar inport
. indent
+ . indent
; Now we have to split a single line into indentation, content and comment.
define : splitindent inport
@@ -262,9 +262,61 @@ define : split-wisp-lines text
call-with-input-string text nostringandbracketbreaks
. splitlines
+define : wisp2lisp-add-inline-colon-brackets line
+ . "Add inline colon brackets to a wisp-line (indent,content,comment)"
+ let : : content : line-content line
+ ; replace final " :" by a function call. There we are by definition of the line-splitting not in a string.
+ when : string-suffix? " :" content
+ set! content : string-append (string-drop-right content 1) "()"
+ ; process the content in reverse direction, so we can detect ' : and turn it into '(
+ let bracketizer : (instring #f) (inbrackets 0) (bracketstoadd 0) (unprocessed content) (processed "")
+ if : < (string-length unprocessed) 3
+ ; if unprocessed is < 3 chars, it cannot contain " : ". We are done.
+ list
+ line-indent line
+ string-append unprocessed processed : xsubstring ")" 0 bracketstoadd
+ line-comment line
+ ; else
+ let : : lastletter : string-take-right unprocessed 1
+ ; check if we’re in a string
+ when : and (equal? "\"" lastletter) : not : equal? "#\\\"" : string-take-right unprocessed 3
+ set! instring : not instring
+ when : and (equal? ")" lastletter) : not : equal? "#\\)" : string-take-right unprocessed 3
+ set! inbrackets : + 1 inbrackets
+ when : and (equal? "(" lastletter) : not : equal? "#\\(" : string-take-right unprocessed 3
+ set! inbrackets : - 1 inbrackets
+ ; error handling: inbrackets must never be smaller than 0 - due to the line splitting.
+ when : < inbrackets 0
+ throw 'more-inline-brackets-closed-than-opened inbrackets line
+ ; when we’re in a string or in brackets , just skip to the next char
+ if : or instring : > inbrackets 0
+ bracketizer instring inbrackets bracketstoadd
+ . : string-drop-right unprocessed 1
+ . : string-append lastletter processed
+ ; check for " : ": That adds a new inline bracket
+ if : equal? " : " : string-take-right unprocessed 3
+ ; replace the last 2 chars with "(" and note
+ ; that we need an additional closing bracket
+ ; at the end.
+ bracketizer instring inbrackets : + 1 bracketstoadd
+ . : string-append (string-drop-right unprocessed 2) "("
+ . processed
+ if : and (> (string-length unprocessed) 3) : equal? " ' (" : string-take-right unprocessed 4
+ ; leave out the second space
+ bracketizer instring inbrackets bracketstoadd
+ . (string-append (string-drop-right unprocessed 3) "'(")
+ . processed
+ ; else, just go on
+ bracketizer instring inbrackets bracketstoadd
+ . (string-drop-right unprocessed 1)
+ . (string-append lastletter processed)
+
+
define : wisp2lisp-parse lisp prev lines
. "Parse the body of the wisp-code."
- append lisp '() ; lines
+ ; let bracketizer : (levels '(0)) (
+ set! lines : map-in-order wisp2lisp-add-inline-colon-brackets lines
+ append lisp lines
define : wisp2lisp-initial-comments lisp prev lines
. "Keep all starting comments: do not start them with a bracket."
@@ -300,6 +352,8 @@ define : wisp2lisp lines
: hashbanged : wisp2lisp-hashbang lisp prev unprocessed
deinitialized : apply wisp2lisp-initial-comments hashbanged
parsed : apply wisp2lisp-parse deinitialized
+ display parsed
+ newline
. parsed
; first step: Be able to mirror a file to stdout
@@ -309,11 +363,13 @@ let*
; Lines consist of lines with indent, content and comment. See
; line-indent, line-content, line-comment and the other
; line-functions for details.
- lines : linestoindented : split-wisp-lines text
+ textlines : split-wisp-lines text
+ lines : linestoindented textlines
lisp : wisp2lisp lines
; display : list-ref lines 100 ; seems good
let show : (processed '()) (unprocessed lisp)
when : not : equal? unprocessed '()
+ display : length processed
display : line-content : list-ref unprocessed 0
display ";"
display : line-comment : list-ref unprocessed 0