最小限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)