(Arne Babenhauserheide)
2013-01-30: update update
diff --git a/Readme.txt b/Readme.txt --- a/Readme.txt +++ b/Readme.txt @@ -4,9 +4,9 @@ Wisp: Whitespace-Lisp (defun a (b c) (let ((d e) - ((f) - (g))) - (h i) + ((f) + ,(g))) + '(h i) j) becomes @@ -15,9 +15,9 @@ becomes let : d e : f - : g - h i + , g + ' h i . j - +State: basics work. : and , and ' as start of the line do not work yet. diff --git a/wisp.py b/wisp.py --- a/wisp.py +++ b/wisp.py @@ -1,14 +1,29 @@ #!/usr/bin/env python3 class Line: + @property + def base(self): + if self.sublevels: + return self.sublevels[0] + return self.indent + + @property + def levels(self): + return self.sublevels + [self.indent] + def __init__(self, line): self.continues = line.lstrip().startswith(". ") if self.continues: self.content = line.lstrip()[2:].lstrip() else: self.content = line.lstrip() + # the indentation of the code self.indent = len(line) - len(line.lstrip()) + # due to : vertical space optimization, the line can have multiple sublevels + # TODO make this work. + self.sublevels = [] while self.content.startswith(": ") and self.content[2:].lstrip(): + self.sublevels.append(self.indent) self.indent += len(self.content) - len(self.content[2:].lstrip()) self.content = self.content[2:].lstrip() if self.content.strip() == ":": @@ -45,16 +60,22 @@ def wisp2lisp(code): if not line.continues: line.content = "(" + line.content # rising indent: sibling function or variable - if line.indent > prev.indent: - levels.append(line.indent) + if line.base > prev.indent: + levels.extend(line.levels) lisplines.append(prev.indent * " " + prev.content) # same indent: neighbour function of variable: close the previour lines bracket - if line.indent == prev.indent: + elif line.base == prev.indent: lisplines.append(prev.indent * " " + prev.content + ")") + for l in line.levels: + if l > levels[-1]: + levels.append(l) # lower indent: parent funtion or variable. Find the number of brackets to close - if prev.indent > line.indent: + elif prev.indent > line.base: bracketstoclose = len([level for level in levels if level >= line.indent]) levels = levels[:-bracketstoclose + 1] + for l in line.levels: + if not levels or l > levels[-1]: + levels.append(l) if prev.continues: bracketstoclose -= 1 lisplines.append(prev.indent * " " + prev.content + ")" * bracketstoclose)