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 と継続の類似点というのは、...アクターそのもの...」というコメントをいただきました。なるほど、なるほど。