最小限Lisp
Web-DB Vol.60が手元にある人はぜひLispの章を見てみてくださいね。Lispのコードがほとんど構文木と同じであって、その構文木を実行するときにどうなるか、という話。
下のコードを見ればわかるとおり、Lispのコードではリストの区切りにカンマがないけどもPythonにはあるってところと、LispのアトムはPythonでは文字列で表現しているので引用符がくっついている。それくらいの違いしかない。で、その構文木がこれくらいのコードで実行出来る、と。
でまあ、これはコードに特殊形式がないから全部「各要素をevalしてから計算をする」という流れになっているのだけども、それじゃifとか実現できなくて困るよね?どうすればいいと思う?というのは機会があればまた今度書く。
# -*- encoding: utf-8 -*- """ mini-Lisp Lisp解説のための、Lisp風構文木を受け取ってそれを実行するコード """ # (print (* 3 (+ 1 2))) に相当 ast = ("print", ("*", 3, ("+", 1, 2))) def eval(ast): if not isinstance(ast, tuple): return ast # already evaled func = ast[0] if func == "*": return eval(ast[1]) * eval(ast[2]) elif func == "+": return eval(ast[1]) + eval(ast[2]) elif func == "print": print eval(ast[1]) return None eval(ast)