Pythonで 関数の中身をリスト(S式)に変換しようとして失敗した話

Pythonで書かれた関数の中身を後から取り出せないか、ちょっと考えてみた。うまくいかなかったけど、出来たとこまでさらす

まずは 演算子オーバーロードして、こんなクラスを用意

class Var(object):
    def __add__(self,x):
        return List(["add",self,x])
    def __radd__(self,x):
        return List(["add",x,self])
    def __sub__(self,x):
        return List(["sub",self,x])
    def __mul__(self,x):
        return List(["mul",self,x])
        (後略)

#ほんとはLispみたいなConsList (S式)にするところなのだけれど
#今回は手抜き

class List(Var,list):
    pass


+1する関数を用意

def add1(x):
    return x+1

普通に数字を入れればこうなる

>>> add1(1)
2

引数としてVarを与えると、関数の中で行われた演算が帰ってくる。
今は足し算のみだけど。

>>> X=Var("X")
>>> X
X
>>> add1(X)
['add', X, 1]

ただし、if文などで終了条件を判定してたりすると(終わらないので)うまくいかない


たとえばこんなの

def fact(n,x=1):
    return x if n<=1 else fact(n-1,n*x)
#数字を入れれば階乗を計算します

>>> fact(3)
6

# X を入れると 終了条件を満たさないので暴走します
>>> fact(X)
 暴走

残念  (つづかない)