(Arne Babenhauserheide)
2013-08-20: Split multiple lets into functions and fixed duplicate initial Split multiple lets into functions and fixed duplicate initial comments.
diff --git a/wisp-guile.w b/wisp-guile.w --- a/wisp-guile.w +++ b/wisp-guile.w @@ -134,7 +134,7 @@ define : line-continues? line . "Check whether the line is a continuation of a previous line (should not start with a bracket)." string-prefix? ". " : line-content line -define : line-empty? line +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 @@ -144,9 +144,9 @@ define : line-merge-comment line : indent : line-indent line content : line-content line comment : line-comment line - if : equal? comment "" + if : equal? "" comment . line ; no change needed - list indent : string-append content ";" content + list indent : string-append content ";" comment . "" ; skip the leading indentation @@ -264,34 +264,43 @@ define : split-wisp-lines text define : wisp2lisp-parse lisp prev lines . "Parse the body of the wisp-code." - append lisp lines + append lisp '() ; lines define : wisp2lisp-initial-comments lisp prev lines . "Keep all starting comments: do not start them with a bracket." + ; TODO: currently this adds the first comment twice let initial-comments : (lisp lisp) (prev prev) (lines lines) if : equal? lines '() ; file only contained comments, maybe including the hashbang . lisp - if : line-empty? prev - initial-comments : append lisp : list : line-merge-comment prev + if : line-empty-code? prev + initial-comments : append lisp : list prev . (list-ref lines 0) (list-tail lines 1) - wisp2lisp-parse lisp prev lines + list lisp prev lines + +define : wisp2lisp-hashbang lisp prev unprocessed + . "Parse a potential initial hashbang line." + if + and + equal? lisp '() ; really the first line + equal? 0 : line-indent prev + string-prefix? "#!" : line-content prev + wisp2lisp-hashbang : append lisp : list : line-merge-comment prev + . (list-ref unprocessed 0) (list-tail unprocessed 1) + list lisp prev unprocessed define : wisp2lisp lines . "Parse indentation in the lines to add the correct brackets." if : equal? lines '() . '() - let parsehashbang ; process the first line up to the content + let : lisp '() ; the processed lines - prev : list-ref lines 0 - unprocessed lines - if - and - equal? lisp '() ; really the first line - equal? 0 : line-indent prev - string-prefix? "#!" : line-content prev - parsehashbang : append lisp : list : line-merge-comment prev - . (list-ref unprocessed 1) (list-tail unprocessed 1) - wisp2lisp-initial-comments (append lisp (list prev)) (list-ref unprocessed 1) (list-tail unprocessed 1) + prev : list-ref lines 0 ; the last line + unprocessed : list-tail lines 1 ; obvious :) + let* + : hashbanged : wisp2lisp-hashbang lisp prev unprocessed + deinitialized : apply wisp2lisp-initial-comments hashbanged + parsed : apply wisp2lisp-parse deinitialized + . parsed ; first step: Be able to mirror a file to stdout let*