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) 暴走
残念 (つづかない)