(Arne Babenhauserheide)
2014-01-22: correctly unescape : and _ correctly unescape : and _
diff --git a/tests/syntax-colon.scm b/tests/syntax-colon.scm --- a/tests/syntax-colon.scm +++ b/tests/syntax-colon.scm @@ -12,7 +12,7 @@ ((a)) (define (hello) - (display "hello")) + (display "hello\n")) (let ((a 1) @@ -23,10 +23,16 @@ (let ((a '()))) (let - ( ; foo + ( ; foo (a '()))) - ( (a)) + +(define (:) + (hello)) + +(:) + + diff --git a/tests/syntax-colon.w b/tests/syntax-colon.w --- a/tests/syntax-colon.w +++ b/tests/syntax-colon.w @@ -12,7 +12,7 @@ let : a define : hello - display "hello" + display "hello\n" let : a 1 @@ -29,3 +29,8 @@ let : a + +define : \: + hello + +\: diff --git a/tests/websafe-indent.scm b/tests/websafe-indent.scm --- a/tests/websafe-indent.scm +++ b/tests/websafe-indent.scm @@ -1,7 +1,12 @@ -(defun a (b c) +(define (a b c) (d e (f) (g h) i)) +(define (_) + (display "hello\n")) +(_) + + diff --git a/tests/websafe-indent.w b/tests/websafe-indent.w --- a/tests/websafe-indent.w +++ b/tests/websafe-indent.w @@ -1,5 +1,10 @@ -defun a : b c +define : a b c _ d e ___ f ___ g h -___ . i +__ . i + +define : _ +_ display "hello\n" + +\_ diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -375,7 +375,10 @@ define : read-whole-file filename define : wisp2lisp-add-inline-colon-brackets line . "Add inline colon brackets to a wisp-line (indent,content,comment). -A line with only a colon and whitespace gets no additional parens!" +A line with only a colon and whitespace gets no additional parens! + +Also unescape \\: to :. +" ; if the line only consists of a colon and whitespace, do not change it. if : line-only-colon? line . line @@ -648,6 +651,57 @@ define : wisp2lisp-lines lines parsed : apply wisp2lisp-parse deinitialized . parsed +define : line-unescape-underscore-and-colon line + . "Unescape underscores at the beginning of the line and colon." + let loop + : processed "" + unprocessed : line-content line + if : equal? "" unprocessed + list + line-indent line + . processed + line-comment line + let + : next : string : string-ref unprocessed 0 + if : equal? "" processed + cond + ; get rid of \_ + : string-prefix? "(\\_" unprocessed + loop processed : string-append "(" : string-drop unprocessed 2 + ; get rid of \: + : string-prefix? "(\\:" unprocessed + loop processed : string-append "(" : string-drop unprocessed 2 + else + loop + string-append processed next + string-drop unprocessed 1 + cond + : string-prefix? " \\:" unprocessed + loop + string-append processed " :" + string-drop unprocessed 3 + : string-prefix? "(\\:" unprocessed + loop + string-append processed "(:" + string-drop unprocessed 3 + else + loop + string-append processed next + string-drop unprocessed 1 + +define : unescape-underscore-and-colon lines + . "Unescape underscores at the beginning of each line and colon." + let loop + : processed '() + unprocessed lines + if : equal? unprocessed '() + . processed + let : : current : car unprocessed + loop + append processed : list : line-unescape-underscore-and-colon current + cdr unprocessed + + define* : string-replace-substring s substr replacement #:optional (start 0) (end (string-length s)) . "Replace every instance of substring in s by replacement." @@ -716,7 +770,8 @@ define : wisp2lisp text textlines : call-with-input-string nobreaks splitlines lines : linestoindented textlines lisp-lines : wisp2lisp-lines lines - join-lisp-lines lisp-lines + clean-lines : unescape-underscore-and-colon lisp-lines + join-lisp-lines clean-lines ; first step: Be able to mirror a file to stdout if : < 1 : length : command-line