クソみたいな椅子を使っているせいか、腰が痛くてしかたがない。それはともかく、 Python みたいな言語でメモ化だのカリー化だのをやっていると、引数に渡したオブジェクトの値が変更された場合ってのを考えないといけない。
Python では基本的にオブジェクトは一意的に割り振られるオブジェクト ID で識別され、もしもメモ化やカリー化の際にオブジェクトが格納された場合、以前と同一の関数に同一のオブジェクトが値が変更された状態で渡されると厄介な事になるかもしれない。例えば次のコードは、呼ばれるたびにリストがどんどん伸張されていく。
@curry
def add(x, y):
x.append(y)
f = add([])
f(1) # [1]
f(2) # [1, 2]
f(3) # [1, 2, 3]
これはやはり好ましい動作ではないだろう。とりあえず解決するには、以下のように copy.deepcopy でオブジェクトのコピーを取るのが考えられる。
from copy import deepcopy
def curry(f):
def _curry_(*args):
def _curry__(arg, x):
full_arg = []
argcp = deepcopy(arg)
_x = deepcopy(x)
full_arg.extend(argcp)
full_arg.extend(_x)
if f.func_code.co_argcount == len(full_arg):
return f(*full_arg)
else:
return curry(f)(*full_arg)
if f.func_code.co_argcount == len(args):
return f(*args)
else:
return lambda *y: _curry__(args, y)
return _curry_
Offensive Programming に対抗して Offensive Web Design というものを思い付いた。
なんかイマイチだな。
新しい crawler 発見。 exalead とかいう所の crawler らしい。 UA 名は "NG/2.0" が使われている。
しかしこの検索エンジン、俺の考えている終わってるデザインを見事に満たしているな。実にダメダメしい。何がダメかというと詰め込み過ぎの一言で終わってしまうのだが。