(Arne Babenhauserheide)
2013-01-30: basic wisp2lisp seems to work basic wisp2lisp seems to work
diff --git a/example.w b/example.w --- a/example.w +++ b/example.w @@ -5,7 +5,9 @@ defun a d e : f + g : - g - h i - . j + h + . i + j k + . l diff --git a/wisp.py b/wisp.py --- a/wisp.py +++ b/wisp.py @@ -1,8 +1,18 @@ #!/usr/bin/env python3 class Line: - def __init__(self, content, indent, continues=False): - self.content, self.indent, self.continues = content, indent, continues + def __init__(self, line): + self.continues = line.lstrip().startswith(". ") + if self.continues: + self.content = line.lstrip()[2:].lstrip() + else: + self.content = line.lstrip() + self.indent = len(line) - len(line.lstrip()) + while self.content.startswith(": ") and self.content[2:].lstrip(): + self.indent += len(self.content) - len(self.content[2:].lstrip()) + self.content = self.content[2:].lstrip() + if self.content.strip() == ":": + self.content = "" def wisp2lisp(code): """Turn wisp code to lisp code.""" @@ -21,15 +31,15 @@ def wisp2lisp(code): # now read the indentation lines = [] for line in code.splitlines(): - lines.append(Line(content = line.lstrip(), - indent = len(line) - len(line.lstrip()), - continues = line.lstrip().startswith(". "))) + lines.append(Line(line)) # finally emit matching lisp code # write into the lisp lines with a delay of 1 line lisplines = [] levels = [] prev = lines[0] + if not prev.continues: + prev.content = "(" + prev.content for line in lines[1:]: # continuing lines do not get a leading bracket. if not line.continues: @@ -43,13 +53,15 @@ def wisp2lisp(code): lisplines.append(prev.indent * " " + prev.content + ")") # lower indent: parent funtion or variable. Find the number of brackets to close if prev.indent > line.indent: - bracketstoclose = 1 + len([level for level in levels if level > line.indent]) - levels = levels[:-bracketstoclose] + bracketstoclose = len([level for level in levels if level >= line.indent]) + levels = levels[:-bracketstoclose + 1] + if prev.continues: + bracketstoclose -= 1 lisplines.append(prev.indent * " " + prev.content + ")" * bracketstoclose) prev = line - lisplines.append(prev.indent * " " + prev.content + ")" * len(levels)) + lisplines.append(prev.indent * " " + prev.content + ")" * (len(levels))) return "\n".join(lisplines)