Bindingと継続の類似性
bindingで作った「もし再帰の深みで評価したら」のサンプルを見ていて、「《Binding》って《継続》と似ているところがあるのでは?」と思いました。その「似ている」感じを表現するため、サンプルを作ってみました。
$env = Array.new def factorial(n) f = 1 if n <= 0 f else f = factorial(n - 1) f *= n end if callcc {|$env[n]| false} p [n, f] $env[n+1].call(true) if $env[n+1] $cc.call(true) end f end unless callcc {|$cc| false} p factorial(10) $env[0].call(true) end
実行結果です。
3628800 [0, 1] [1, 1] [2, 2] [3, 6] [4, 24] [5, 120] [6, 720] [7, 5040] [8, 40320] [9, 362880] [10, 3628800]
似ている点をちゃんと書きますと…
- Bindingオブジェクトを持っていれば「過去のある時点で評価する」ことができます。
- 継続のcallccで得られるContinuationオブジェクトを持っていれば「過去のある時点へ制御を移す」ことができます。
ね、似ているでしょ?
追記:ささださんから「Proc と継続が似ていて、Proc と Binding は似ている...Proc と継続の類似点というのは、...アクターそのもの...」というコメントをいただきました。なるほど、なるほど。