(Arne Babenhauserheide)
2013-01-30: first version, still bugs. first version, still bugs.
diff --git a/example.w b/example.w --- a/example.w +++ b/example.w @@ -1,7 +1,11 @@ defun a + b c let - : d e - : f - : g + : + d e + : + f + : + g h i . j diff --git a/wisp.py b/wisp.py new file mode 100644 --- /dev/null +++ b/wisp.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +class Line: + def __init__(self, content, indent, continues=False): + self.content, self.indent, self.continues = content, indent, continues + +def wisp2lisp(code): + """Turn wisp code to lisp code.""" + # first get rid of linebreaks in strings + instring = False + nostringbreaks = [] + for char in code: + if char == '"': + instring = not instring + if instring and char == "\n": + nostringbreaks.append("\\n") + else: + nostringbreaks.append(char) + code = "".join(nostringbreaks) + + # 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(". "))) + + # finally emit matching lisp code + # write into the lisp lines with a delay of 1 line + lisplines = [] + levels = [] + prev = lines[0] + for line in lines[1:]: + # continuing lines do not get a leading bracket. + if not line.continues: + line.content = "(" + line.content + # rising indent: sibling function or variable + if line.indent > prev.indent: + levels.append(line.indent) + lisplines.append(prev.indent * " " + prev.content) + # same indent: neighbour function of variable: close the previour lines bracket + if line.indent == prev.indent: + 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] + lisplines.append(prev.indent * " " + prev.content + ")" * bracketstoclose) + + prev = line + + lisplines.append(prev.indent * " " + prev.content + ")" * len(levels)) + + return "\n".join(lisplines) + + + +if __name__ == "__main__": + print() + with open("example.w") as f: + wisp = f.read() + print(wisp2lisp(wisp)) +