Accumulator Generator
PythonのクロージャはD言語寄りなんでしょうか。
以下のコードは普通に動く
>>> b = (lambda x: lambda y: x+y)( 90 ) >>> b( 10 ) 100
でも以下のように累積できない。
>>> def foo1( x ) : ... def foo2( y ) : ... x += y ... return x ... return foo2 ... >>> f = foo1( 95 ) >>> f( 1 ) Traceback (most recent call last): File , line 0, in <string>##36 File , line 0, in _stub_##24 File , line 0, in foo2 UnboundLocalError: local variable 'x' referenced before assignment
本当のxじゃない何者かに置き換わってるってことですかね。
ちょっと探してたら,ポールグレアム氏のページに辿り着きました。
Accumulator Generatorそこにあったコードはこんな感じ
http://www.paulgraham.com/accgen.html
>>> class foo: ... def __init__(self, n): ... self.n = n ... def __call__(self, i): ... self.n += i ... return self.n ... # 以下は付け足したコード >>> f = foo( 10 ) >>> f( 10 ) 20 >>> f( 10 ) 30
発想の転換というか卑怯というか><;