(Arne Babenhauserheide)
2013-08-22: started to implement bracket adding. Currently broken. started to implement bracket adding. Currently broken.
diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -317,12 +317,96 @@ define : wisp2lisp-add-inline-colon-brac . (string-append lastletter processed) +define : last-indent levels + . "Retrieve the indentation of the last line: Simply the highest level." + list-ref levels 0 + +define : line-add-starting-bracket line + . "Add a starting bracket to the line, if it is no continuation line (it is more indented than the previous)." + list + line-indent line + string-append + . "(" + line-content line + line-comment line + +define : line-add-closing-brackets line number + . "Add a closing bracket to the line." + list + line-indent line + string-append + line-content line + xsubstring ")" 0 number + line-comment line + +define : line-indent-bracketstoclose line-indent levels + . "Find the number of brackets to close to reduce the levels to the line-indent." + let closer : (bracketstoclose 0) (rest levels) + if : < line-indent : list-ref rest 0 + closer (+ bracketstoclose 1) (list-tail rest 1) + ; TODO: if next-indent is not equal to list-ref levels 0, that’s a syntax error + . bracketstoclose + + define : wisp2lisp-parse lisp prev lines . "Parse the body of the wisp-code." ; let bracketizer : (levels '(0)) ( set! lines : map-in-order wisp2lisp-add-inline-colon-brackets lines - let bracketizer : (pre prev) (unprocessed lines) (processed lisp) - append lisp lines + let bracketizer : (levels '(0)) (pre prev) (unprocessed lines) (processed lisp) + display pre + newline + ; levels is the list of levels, with the lowest to the right. i.e: '(12 8 4 0) + ; once we processed everything, we pass the bracketizer pre as f one last time + if : equal? #f : line-content pre + . lisp + let* + : pre-indent : line-indent pre + next + if : equal? unprocessed '() + list 0 #f #f ; this is the break condition for the next loop! + list-ref unprocessed 0 + next-indent : line-indent next + if : line-empty-code? next ; empty lines get silently added, but otherwise ignored + bracketizer levels pre + list-tail unprocessed 1 + append processed : list next + ; if pre was a continuation, the real levels are 1 lower than the counted levels + let : : reallevels : if (not (line-continues? pre)) levels : list-tail levels 1 + cond + : > next-indent pre-indent ; I do not need to add brackets to pre, but next a starting bracket, except if it continues + ; TODO: If next continues *and* is deeper indented than pre, that’s an error case. + let : : newlevels : append (list next-indent) reallevels + bracketizer newlevels + if : line-continues? next + . next + line-add-starting-bracket next + list-tail unprocessed 1 + append processed : list pre + : = next-indent pre-indent ; pre needs a closing bracket, next needs an opening bracket, except if they continue + bracketizer reallevels + if : line-continues? next + . next + line-add-starting-bracket next + list-tail unprocessed 1 + append processed + list + if : line-continues? pre + . pre + line-add-closing-brackets pre 1 + : < next-indent pre-indent ; we need to add the correct number of closing brackets to pre and possibly one to next + let : : bracketstoclose : line-indent-bracketstoclose next-indent reallevels + bracketizer + list-tail levels : - bracketstoclose 1 + if : line-continues? next + . next + line-add-starting-bracket next + list-tail unprocessed 1 + append processed + list + if : line-continues? pre + line-add-closing-brackets pre : - bracketstoclose 1 + line-add-closing-brackets pre bracketstoclose + define : wisp2lisp-initial-comments lisp prev lines . "Keep all starting comments: do not start them with a bracket."