(Arne Babenhauserheide)
2013-03-25: support shebang lines - this makes the code quite a bit more support shebang lines - this makes the code quite a bit more complex…
diff --git a/tests/shebang.w b/tests/shebang.w
new file mode 100644
--- /dev/null
+++ b/tests/shebang.w
@@ -0,0 +1,2 @@
+#!/usr/bin/wisp.py
+; This tests shebang lines
\ No newline at end of file
diff --git a/tests/sublist.w b/tests/sublist.w
new file mode 100644
--- /dev/null
+++ b/tests/sublist.w
@@ -0,0 +1,5 @@
+; sublists allow to start single line function calls with a colon ( : ).
+;
+defun a : b c
+ let : : e . f
+ . g
diff --git a/wisp.py b/wisp.py
--- a/wisp.py
+++ b/wisp.py
@@ -158,6 +158,9 @@ class Line:
):
if self.content[n-1:n+2] == " : " or self.content[n-1:] == " :":
bracketstoclose += 1
+ # we have to keep the space after the colon (" : "
+ # → " ( "), otherwise we cannot use two
+ # consecutive colons (" : : ") which would be surprising.
self.content = self.content[:n] + "(" + self.content[n+1:]
# after the full line processing, replace " \\: " "\n\\: " and
@@ -233,11 +236,36 @@ def wisp2lisp(code):
emptylines = []
levels = [0]
prev = lines[0]
- # process the first line in the file
- if not prev.continues:
+ #: The index of the first code line
+ codestartindex = 0
+ # process the first line in the file.
+ # Shebang lines need to be used verbatim
+ if not prev.indent and prev.content.startswith("#!"):
+ codestartindex += 1
+ if prev.comment:
+ prev.content += ";" + prev.comment
+ lisplines.append(prev.content)
+ if codestartindex < len(lines):
+ prev = lines[codestartindex]
+ else:
+ prev = None
+
+ # initial comment lines need special treatment to avoid starting
+ # them with () (implementation detail)
+ while prev and prev.empty:
+ codestartindex += 1
+ if prev.comment:
+ prev.content += ";" + prev.comment
+ lisplines.append(prev.indent * " " + prev.content)
+ if codestartindex < len(lines):
+ prev = lines[codestartindex]
+ else:
+ prev = None
+ if prev and not prev.continues:
prev.content = prev.prefix + "(" + prev.content
+
# process further lines: adjust the content of the current line, but only append
- for line in lines[1:]:
+ for line in lines[codestartindex+1:]:
# ignore empty lines and comment-only lines
if line.empty:
# simply keep empty lines and ignore their indentation
@@ -280,9 +308,10 @@ def wisp2lisp(code):
lisplines.extend(emptylines)
emptylines = []
- if prev.continues:
+ if prev and prev.continues:
levels.pop()
- lisplines.append(prev.indent * " " + prev.content + ")" * (len(levels)))
+ if prev:
+ lisplines.append(prev.indent * " " + prev.content + ")" * (len(levels)))
lisplines.extend(emptylines)
# get rid of brackets around empty lines
@@ -291,7 +320,6 @@ def wisp2lisp(code):
lisplines[n] = ""
return "\n".join(lisplines).replace("\\LINEBREAK", "\n")
-
if __name__ == "__main__":