info

クロージャーの何がうれしいの?

http://practical-scheme.net/trans/icad-j.html
ここの、アキュームレータージェネレーターのコードを見てもイマイチ理解できない人へ

参照を意識すれば、遠くの所の変数に副作用をおよぼすことができる、クラスでは大袈裟だと思う所に作るのが吉? ツッコミ求ム
Rubyクロージャーを使ったgetter/setter 配列の要素を二乗にする関数を作ってみる

def setgen(x)
  lambda{|i| x[0..-1] = i}
end

def getgen(x)
  lambda{x}
end

def doublegen(x)
  lambda{x.map! {|i| i ** 2}}
end

a = []
set = setgen(a)
get = getgen(a)
d = doublegen(a)
a = nil

>> get.call()
=> []

set.call([42, 42, 42])

>> get.call()
=> [42, 42, 42]

d.call()

>> get.call()
=> [1764, 1764, 1764]

クロージャーが入ったb変数をいろいろな所に持ち出せば、どこでもaの配列を変更できる
目当てのクロージャーを作り終わった後、元々の参照が入っていた変数をnilにすれば、ポインタがぶらさがってるのはクロージャーの中だけなので、カプセル化したことになる?

値を保存して、その値を操作したり、その値を元にして何かするってことができる

カリー化については勉強中・・・・・・