(Arne Babenhauserheide)
2014-01-21: only colon + whitespace on a line works. only colon + whitespace on a line works.
diff --git a/.bugs/bugs b/.bugs/bugs --- a/.bugs/bugs +++ b/.bugs/bugs @@ -16,7 +16,7 @@ multiline comments (srfi-30) support nested multi-line comments with #| ... |# | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:8cf6202873d4454f57813dd17cf60432059f7c62, time:1389569421.6 the repl does not require 3 returns when you use a single char as function, or rather only does so every second time | owner:, open:True, id:9cedd0bdbf4a3b17add4bfe86ad5a23e500cfc6c, time:1379064870.78 wisp-guile.w breaks on ";" and complex brackets with bracket char literals. See wisp-guile.w::91 | owner:, open:False, id:9d8b6f87fa5365733fc8655614dbf2a9ba5bd054, time:1377533321.27 -FIX regression: empty line with only : does not remove the :. It transforms to (:, it should transform to ( | owner:, open:True, id:a2323d347612425bc5af577c939916c8b60ec1c9, time:1389631450.78 +FIX regression: empty line with only : does not remove the :. It transforms to (:, it should transform to ( | owner:, open:False, id:a2323d347612425bc5af577c939916c8b60ec1c9, time:1389631450.78 wisp-mode: handle lines starting with underscores: currently sees the underscores as function call. | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:b2c3755e1deb8355655a334d569679e2e62d2836, time:1376612093.55 make this work: let : : origfile ( open-file : nth 1 : command-line ) r | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:d6de2074a5017f1f29f34d142ce797981ed270a0, time:1366529287.67 wisp.py breaks on \ - quote, escaped backslash, quote | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:d75a93ca58ade5b3e3e51f1e7ee9782e743ac131, time:1377424552.02 diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -227,6 +227,10 @@ define : line-empty-code? line . "Check whether the code-part of the line is empty: contains only whitespace and/or comment." equal? "" : line-content line +define : line-only-colon? line + . "Check whether the line content consists only of a colon and whitespace." + equal? ":" : string-trim-right : line-content line + define : line-merge-comment line . "Merge comment and content into the content. Return the new line." let @@ -365,102 +369,107 @@ define : read-whole-file filename 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 linebracketizer ( ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) ) - let linebracketizer : ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) - if : < (string-length unprocessed) 2 - ; if unprocessed is < 2 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 - lastupto3 : string-take-right unprocessed : min 3 : string-length unprocessed - lastupto4 : string-take-right unprocessed : min 4 : string-length unprocessed - lastupto6 : string-take-right unprocessed : min 6 : string-length unprocessed - ; check if we’re in a string - when - or - and - not instring - equal? "\"" lastletter - not : equal? "#\\\"" lastupto3 - and - . instring - equal? "\"" lastletter - not : endsinunevenbackslashes : string-drop-right unprocessed 1 - set! instring : not instring - when : not instring - when : and (equal? ")" lastletter) : not : equal? "#\\)" lastupto3 - set! inbrackets : + 1 inbrackets ; remember that we're going backwards! - when : and (equal? "(" lastletter) : not : equal? "#\\(" lastupto3 - set! inbrackets : - inbrackets 1 - ; 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 - cond - : or instring : > inbrackets 0 - linebracketizer instring inbrackets bracketstoadd - . : string-drop-right unprocessed 1 - . : string-append lastletter processed - ; else check for " : ": That adds a new inline bracket - ; support : at the beginning of a line, too. - : or (equal? " : " lastupto3) (equal? ": " lastupto3) - ; replace the last 2 chars with "(" and note - ; that we need an additional closing bracket - ; at the end. - linebracketizer instring inbrackets : + 1 bracketstoadd - string-append (string-drop-right unprocessed 2) - string-append "(" processed - ; turn " ' (" into " '(", do not modify unprocessed, except to shorten it! - ; same for ` , #' #` #, #,@, - : and (string-prefix? "(" processed) : equal? " ' " lastupto3 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 2) "'") - . processed - : and (string-prefix? "(" processed) : equal? " , " lastupto3 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 2) ",") - . processed - : and (string-prefix? "(" processed) : equal? " ` " lastupto3 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 2) "`") - . processed - : and (string-prefix? "(" processed) : equal? " #` " lastupto4 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 3) "#`") - . processed - : and (string-prefix? "(" processed) : equal? " #' " lastupto4 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 3) "#'") - . processed - : and (string-prefix? "(" processed) : equal? " #, " lastupto4 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 3) "#,") - . processed - : and (string-prefix? "(" processed) : equal? " #,@, " lastupto6 - ; leave out the second space - linebracketizer instring inbrackets bracketstoadd - . (string-append (string-drop-right unprocessed 5) "#,@,") - . processed - : . else ; just go on - linebracketizer instring inbrackets bracketstoadd - . (string-drop-right unprocessed 1) - . (string-append lastletter processed) + . "Add inline colon brackets to a wisp-line (indent,content,comment). + +A line with only a colon and whitespace gets no additional parens!" + ; if the line only consists of a colon and whitespace, do not change it. + if : line-only-colon? line + . line + 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 linebracketizer ( ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) ) + let linebracketizer : ( instring #f ) ( inbrackets 0 ) ( bracketstoadd 0 ) ( unprocessed content ) ( processed "" ) + if : < (string-length unprocessed) 2 + ; if unprocessed is < 2 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 + lastupto3 : string-take-right unprocessed : min 3 : string-length unprocessed + lastupto4 : string-take-right unprocessed : min 4 : string-length unprocessed + lastupto6 : string-take-right unprocessed : min 6 : string-length unprocessed + ; check if we’re in a string + when + or + and + not instring + equal? "\"" lastletter + not : equal? "#\\\"" lastupto3 + and + . instring + equal? "\"" lastletter + not : endsinunevenbackslashes : string-drop-right unprocessed 1 + set! instring : not instring + when : not instring + when : and (equal? ")" lastletter) : not : equal? "#\\)" lastupto3 + set! inbrackets : + 1 inbrackets ; remember that we're going backwards! + when : and (equal? "(" lastletter) : not : equal? "#\\(" lastupto3 + set! inbrackets : - inbrackets 1 + ; 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 + cond + : or instring : > inbrackets 0 + linebracketizer instring inbrackets bracketstoadd + . : string-drop-right unprocessed 1 + . : string-append lastletter processed + ; else check for " : ": That adds a new inline bracket + ; support : at the beginning of a line, too. + : or (equal? " : " lastupto3) (equal? ": " lastupto3) + ; replace the last 2 chars with "(" and note + ; that we need an additional closing bracket + ; at the end. + linebracketizer instring inbrackets : + 1 bracketstoadd + string-append (string-drop-right unprocessed 2) + string-append "(" processed + ; turn " ' (" into " '(", do not modify unprocessed, except to shorten it! + ; same for ` , #' #` #, #,@, + : and (string-prefix? "(" processed) : equal? " ' " lastupto3 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 2) "'") + . processed + : and (string-prefix? "(" processed) : equal? " , " lastupto3 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 2) ",") + . processed + : and (string-prefix? "(" processed) : equal? " ` " lastupto3 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 2) "`") + . processed + : and (string-prefix? "(" processed) : equal? " #` " lastupto4 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 3) "#`") + . processed + : and (string-prefix? "(" processed) : equal? " #' " lastupto4 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 3) "#'") + . processed + : and (string-prefix? "(" processed) : equal? " #, " lastupto4 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 3) "#,") + . processed + : and (string-prefix? "(" processed) : equal? " #,@, " lastupto6 + ; leave out the second space + linebracketizer instring inbrackets bracketstoadd + . (string-append (string-drop-right unprocessed 5) "#,@,") + . processed + : . else ; just go on + linebracketizer instring inbrackets bracketstoadd + . (string-drop-right unprocessed 1) + . (string-append lastletter processed) define : last-indent levels @@ -476,7 +485,7 @@ If line is indented and only contains : The line *must* have a whitespace after the prefix, except if the prefix is the only non-whitespace on the line." ; if the line only contains a colon, we just replace its content with an opening paren. - if : equal? ":" : string-trim-right : line-content line ; FIXME: Check for this somewhere else. + if : line-only-colon? line ; FIXME: Check for this somewhere else. list line-indent line string-append "(" : string-drop (line-content line) 1 ; keep whitespace @@ -583,22 +592,10 @@ define : wisp2lisp-parse lisp prev lines final-line : equal? #f : line-content next bracketstocloseprev : if (line-empty-code? pre) 0 : line-indent-brackets-to-close next-indent levels next-continues pre-continues bracketstoopennext : line-indent-brackets-to-open next-indent levels next-continues pre-continues - newnext - if : equal? ":" : string-trim-right : line-content next - list - line-indent next - string-drop (line-content next) 1 - line-comment next - . next - newnext2 - if final-line - . newnext - if : > bracketstoopennext 0 - line-add-starting-bracket newnext - . newnext + newnext : if final-line next : if (> bracketstoopennext 0) (line-add-starting-bracket next) next newpre : line-drop-continuation-dot : line-add-closing-brackets pre bracketstocloseprev newlevels : line-indent-levels-adjust levels next-indent - bracketizer newlevels newnext2 + bracketizer newlevels newnext if final-line unprocessed : list-tail unprocessed 1 append processed (list newpre) whitespace list