Diary?::2006-01-02

15:31

昼寝をしたらとんでもない悪夢をみた。「高田延彦とよくわからん女子アナに延々と遠回しに罵られる」。そして舞台は相変わらず昔の家。

20:02

また俺のみた夢の話でアレだけど、最近昔の家以外が舞台の悪夢をみたことを思い出した。これはかなり酷かった。

  1. 舞台は大学の部室。
  2. 俺は何故かピストルと弾薬を渡されて、胡散臭いねーちゃんに「奴を倒したら出してあげる」と言われる。
  3. 目の前には mtg の Abomination のようなクリーチャー。こいつを倒せと?
  4. 当然撃っても死なない。弾が切れてひたすら逃げているうちに目が醒める。

23:45

ある一つの変数に複数の関数を適用する場合、きっと次のようなコードを書くと思う。

x = f3(f2(f1(x)))

これを別の書き方にしてみようと思い立ち、次のようなコードを書いてみた。

f1 = lambda x: x+1
f2 = lambda x: x+2
f3 = lambda x: x+3

def mix(funcs, arg):
	if len(funcs) > 1:
		return mix(funcs[1:], funcs[0](arg))
	else:
		return funcs[0](arg)

print m([f1, f2, f3], 1)

それで、これで何か嬉しいことってあるか? カリー化すれば、いろんな所で行う定型処理みたいなのをまとめるのに使える、かも。あと適用する関数の数が不定の場合に、次みたいに書かなくて済む。

for f in funcs:
	x = f(x)

でも引数が増えた場合とかどうすんだ? このままじゃ funcs の要素に n in m out な関数が入れられないじゃん (これはループの奴でも同じだけど)。

と思ったら、 funcs の要素を全部戻り値をタプルで返すような関数にすれば動くことがわかった。以下はそのコード。

f1 = lambda x, y: (x+y, x-y)
f2 = lambda x, y: (x*y,)
f3 = lambda x: (x-3,)

def mix(funcs, args):
	if len(funcs) > 1:
		return mix(funcs[1:], funcs[0](*args))
	else:
		return funcs[0](*args)

print m([f1, f2, f3], (3, 1))[0]

いや、だからこれで何が嬉しいんだ? とりあえず具体的に何が呼ばれるかが実行時まで確定できなくて、さらに n in m out な状況でも使えるようになったけど、既存の関数の動作を変える必要があるのがダメ過ぎる。もう少し練ってみるかな。

Written by Kuwata Chikara
Creative Commons