(Arne Babenhauserheide)
2016-07-19: wisp-guile.w: Enable continuing lines started with a colon. API limited-multiline-colon-parens wisp-guile.w: Enable continuing lines started with a colon. API CHANGE.
diff --git a/wisp-guile.w b/wisp-guile.w
--- a/wisp-guile.w
+++ b/wisp-guile.w
@@ -470,54 +470,54 @@ Also unescape \\: to :.
. : 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
+ : or (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 ` , #' #` #, #,@,
+ ; 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
+ ; 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
+ ; 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
+ ; 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
+ ; 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
+ ; 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
+ ; 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
+ ; 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)
+ linebracketizer instring inbrackets bracketstoadd
+ . (string-drop-right unprocessed 1)
+ . (string-append lastletter processed)
define : last-indent levels
@@ -569,6 +569,14 @@ The line *must* have a whitespace after
line-comment line
else
loop : cdr paren-prefixes
+
+define : line-add-starting-brackets-multiple line number
+ . "Add multiple starting brackets."
+ if : = 0 number
+ . line
+ line-add-starting-brackets-multiple
+ line-add-starting-bracket line
+ - number 1
define : line-add-closing-brackets line number
. "Add a closing bracket to the line."
@@ -584,16 +592,18 @@ define : line-indent-brackets-to-close l
; adjust the levels until the highest indentation level is equal
; to the indentation of the next line. Then check for
; continuation.
- let closer : (bracketstoclose 0) (rest levels)
- let : : highest-level : list-ref rest 0
- ; finish-condition
- if : = line-indent highest-level
- if prev-continues
- . bracketstoclose
- + 1 bracketstoclose
- if : > line-indent highest-level
- closer (- bracketstoclose 1) : append (list line-indent) rest
- closer (+ bracketstoclose 1) : list-tail rest 1
+ ; we need real start of the line, not the imaginary start of the code
+ let : : line-indent : inexact->exact : real-part line-indent
+ let closer : (bracketstoclose 0) (rest levels)
+ let : : highest-level : list-ref rest 0
+ ; finish-condition
+ if : = line-indent highest-level
+ if prev-continues
+ . bracketstoclose
+ + 1 bracketstoclose
+ if : > line-indent highest-level
+ closer (- bracketstoclose 1) : append (list line-indent) rest
+ closer (+ bracketstoclose 1) : list-tail rest 1
define : line-indent-brackets-to-open line-indent levels line-continues prev-continues
@@ -604,13 +614,15 @@ define : line-indent-brackets-to-open li
define : line-indent-levels-adjust levels next-indent
. "Add or remove levels so the highest remaining level matches next-indent."
- let adjuster : (lev levels)
- let : : highest-level : list-ref lev 0
- if : = next-indent highest-level
- . lev
- if : > next-indent highest-level
- append (list next-indent) lev
- adjuster : list-tail lev 1
+ ; take the imaginary levels into account
+ let : : next-indent : inexact->exact : + (real-part next-indent) (imag-part next-indent)
+ let adjuster : (lev levels)
+ let : : highest-level : list-ref lev 0
+ if : = next-indent highest-level
+ . lev
+ if : > next-indent highest-level
+ append (list next-indent) lev
+ adjuster : list-tail lev 1
define : line-drop-continuation-dot line
let : : content : line-content line
@@ -619,7 +631,26 @@ define : line-drop-continuation-dot line
if : line-continues? line
string-drop content 2
. content
- line-comment line
+ line-comment line
+
+define : line-drop-leading-colon line
+ let*
+ : content : line-content line
+ indent : line-indent line
+ addindent
+ if : >= 1 : string-length content
+ . #f
+ string-index content
+ λ (x) : not : equal? #\space x
+ . 1
+ list
+ if addindent
+ + indent : * addindent 0+1i ; add imaginary indentation
+ . indent
+ if addindent
+ string-drop content addindent
+ . content
+ line-comment line
define : wisp2lisp-parse lisp prev lines
. "Parse the body of the wisp-code."
@@ -648,13 +679,27 @@ 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 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 newnext
- if final-line unprocessed : list-tail unprocessed 1
- append processed (list newpre) whitespace
- list
+ let de-colonizer
+ : next next
+ levels : line-indent-levels-adjust levels next-indent
+ addcolonbrackets 0
+ if
+ and
+ not final-line
+ not : line-empty-code? next
+ string-prefix? ": " : string-trim-right (line-content next) #\space
+ de-colonizer
+ line-drop-leading-colon next
+ line-indent-levels-adjust levels : line-indent : line-drop-leading-colon next
+ + 1 addcolonbrackets
+ let : : next : line-add-starting-brackets-multiple next addcolonbrackets
+ bracketizer levels
+ if final-line next
+ if (> bracketstoopennext 0) (line-add-starting-bracket next) next
+ if final-line unprocessed : list-tail unprocessed 1
+ append processed (list newpre) whitespace
+ list
define : wisp2lisp-initial-comments lisp prev lines
@@ -798,7 +843,9 @@ define : join-lisp-lines lisp-lines
: next : list-ref unprocessed 0
nextstring
string-append
- xsubstring " " 0 : line-indent next
+ xsubstring " " 0
+ inexact->exact
+ real-part : line-indent next
; here we re-add all necessary linebreakswe get rid
unescape-linebreaks : line-content next
if : equal? "" : line-comment next
diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -372,7 +372,7 @@ define : line-code-replace-inline-colons
; format #t "replace inline colons for line ~A\n" line
let loop
: processed '()
- unprocessed line
+ unprocessed line
cond
: null? unprocessed
; format #t "inline-colons processed line: ~A\n" processed
@@ -638,35 +638,35 @@ define : wisp-replace-paren-quotation-re
quoted lists."
match code
: 'REPR-QUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'quote : map wisp-replace-paren-quotation-repr a
+ list 'quote : map wisp-replace-paren-quotation-repr a
: a ... 'REPR-QUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b ; this is the quoted empty list
- append
+ append
map wisp-replace-paren-quotation-repr a
list : list 'quote : map wisp-replace-paren-quotation-repr b
: 'REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd 'REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'quasiquote : list 'unquote : map wisp-replace-paren-quotation-repr a
+ list 'quasiquote : list 'unquote : map wisp-replace-paren-quotation-repr a
: 'REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'unquote : map wisp-replace-paren-quotation-repr a
+ list 'unquote : map wisp-replace-paren-quotation-repr a
: a ... 'REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b
- append
+ append
map wisp-replace-paren-quotation-repr a
list : list 'unquote : map wisp-replace-paren-quotation-repr b
: 'REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'quasiquote : map wisp-replace-paren-quotation-repr a
+ list 'quasiquote : map wisp-replace-paren-quotation-repr a
: a ... 'REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b ; this is the quoted empty list
- append
+ append
map wisp-replace-paren-quotation-repr a
list : list 'quasiquote : map wisp-replace-paren-quotation-repr b
: 'REPR-UNQUOTESPLICING-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'unquote-splicing : map wisp-replace-paren-quotation-repr a
+ list 'unquote-splicing : map wisp-replace-paren-quotation-repr a
: 'REPR-SYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'syntax : map wisp-replace-paren-quotation-repr a
+ list 'syntax : map wisp-replace-paren-quotation-repr a
: 'REPR-UNSYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'unsyntax : map wisp-replace-paren-quotation-repr a
+ list 'unsyntax : map wisp-replace-paren-quotation-repr a
: 'REPR-QUASISYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'quasisyntax : map wisp-replace-paren-quotation-repr a
+ list 'quasisyntax : map wisp-replace-paren-quotation-repr a
: 'REPR-UNSYNTAXSPLICING-e749c73d-c826-47e2-a798-c16c13cb89dd a ...
- list 'unsyntax-splicing : map wisp-replace-paren-quotation-repr a
+ list 'unsyntax-splicing : map wisp-replace-paren-quotation-repr a
: a ...
map wisp-replace-paren-quotation-repr a
a