pythonで評価器的な物を書いて昔を懐かしんだ。

昔こういうの書いてましたね。

以下のような感じで実行する感じです。

# 10
Application.run([Value(10)])
# 10 + 20
Application.run([BOp("+", Value(10), Value(20))])
# x = 10; x + 1
Application.run([Assign("x", 10), BOp("+", Var("x"), Value(1))])
# sq = lambda x * x; sq(10)
Application.run([
    Assign("sq", Lambda(["x"], BOp("*", Var("x"), Var("x")))),
    Apply("sq", Value(10))
])
# fact = (lambda x: if (x < 0) then 1 else x * fact(x-1); fact(10))
Application.run([
    Assign("fact",
           Lambda(["x"],
                  If(BOp("<", Var("x"), Value(1)),
                     Value(1),
                     BOp("*", Var("x"), Apply("fact", BOp("-", Var("x"), Value(1))))))),
    Apply("fact", Value(10))
])
# even = (lambda x: if (x == 0) then T else odd(x-1));
# odd = (lambda x: if (x == 0) then F else even(x-1));
# odd(5)
# even(4)
# even(11)
Application.run([
    Assign("even",
           Lambda(["x"],
                  If(BOp("==", Var("x"), Value(0)),
                     Value(True),
                     Apply("odd", BOp("-", Var("x"), Value(1)))))),
    Assign("odd",
           Lambda(["x"],
                  If(BOp("==", Var("x"), Value(0)),
                     Value(False),
                     Apply("even", BOp("-", Var("x"), Value(1)))))),
    Apply("odd", Value(5)),
    Apply("even", Value(4)),
    Apply("even", Value(11))
])