R6RS:翻訳:R6RS:1.11 Continuations

R6RS:翻訳:R6RS:1.11 Continuations

1.11 継続

Scheme の式を評価しているときには常にその式の結果を必要としている継続がある。継続はその計算の(既定の)将来全体を表している。例えば、非形式的には (+ 1 3) 内の 3 の継続は、それに 1 を足す。通常はこれらの偏在する継続は状態の裏に隠れていて、プログラマがそれについて必要以上に考える必要はない。ただし、稀に、プログラマが継続を扱う必要があることもある。 call-with-current-continuation 手続き(R6RS:翻訳:R6RS:11.15 Control features 参照)では、 Scheme プログラマに現在の継続を復帰させる手続きを作成させて、それを可能にしている。 call-with-current-continuation は手続きをひとつ受け取り、脱出手続きを引き数としてその手続きを呼び出す。この脱出手続きは、 call-with-current-continuation の呼び出し結果となる引き数とともに呼び出すことができる。すなわち、脱出手続はそれ自体の継続を破棄し、 call-with-current-continuation の呼び出しへの継続を復帰させるのである。

次の例では、その引き数に 1 を足す継続を表す脱出手続きを escape に束縛し、 3 を引き数として呼び出す。 escape の呼び出しへの継続は破棄され、代わりに 3 は、それに 1 を足す継続に引き渡される。

(+ 1 (call-with-current-continuation
       (lambda (escape)
         (+ 2 (escape 3))))) 
                ⇒ 4

脱出手続きは無制限の存続期間を持つ。脱出手続きの補足した継続の起動したあとにも呼び出すことができ、複数回呼び出すことができる。これにより、 call-with-current-continuation は、他の言語の例外のような、典型的な大域的制御構文よりもさらに有意に強力になっているのである。


Last modified : 2008/11/07 22:43:17 UTC