ちょっとはまった。結局オブジェクト作って解決しといたけど気持ち悪いので少し調べた。(でも未解決)
クロージャでカウンタを考える。Open Source WEBを参考に
perlだと
sub make_counter {
my $c = $_[0] || 0;
return sub { $c++ }
}
gaucheだとこんな感じ
(define (make-counter n)
(let1 c n
(lambda () (inc! c))))
でもpythonだとだめなの
def make_counter(n):
c = n
def counter():
c = c + 1
return c
return counter
スコープの洗礼をうけた。参照できても代入できないのでglobalにする必要が。
def make_counter(n):
c = n
def counter():
global c
c += 1
return c
return counter
ctr = make_counter(5)
ctr()
ctr()
Traceback (most recent call last):
File "C:\home\kzfm\test.py", line 10, in <module>
ctr()
File "C:\home\kzfm\test.py", line 5, in counter
c += 1
NameError: global name 'c' is not defined
とかいってglobalでも駄目だ。