継続(Continuation)とは次に行う処理のことです。
まずプログラムの制御について見てみましょう。
gosh> (begin
(print "first")
(print "second")
(print "third"))
first
second
third
#<undef>
これは三つの文字列を順に評価したものです。初めに"first"を表示し、次に
"second"を表示、最後に"third"を表示するように書きました。
なぜ、print式をこのような順に書いたかというと、「begin式は渡された引数の
順(上から下へ)に式を評価する」と定義さてているからです。
もし渡された引数の順とは逆に評価されるようにbeginが定義されていれば、
(begin
(print "third")
(print "second")
(print "first"))
と書いていたでしょう。他の例も見てみましょう。
例えば、「3と4を掛けた後に10を足す」という計算は以下のように書けます。
gosh> (+ (* 3 4) 10)
22
gosh>
(* 3 4)が評価した後、その値と10が足されます。
+式の中の(* 3 4)を呼び出した後に自分のところへ値が返ってくる、ということは当り前のことかも知れません。しかし、このように手続きを呼び出し、その返り値が自分のところへ返ってくるのは、処理系がサポートしているからなのです。
言語によっては、呼び出し元の関数が分からず呼び出したらもう戻ってこ
ないものもあります。呼び出し元の関数に値が返ってくるのは、どこから自分を呼び出したのかという情報をどこかで管理し、呼び出された側はその
情報を元に値を返すという決まりがあるからです。
この、次にどこへ移動するかを示す情報のことを継続と言います。
継続は言語の内部で処理され、表に出ることはなかなかありません。しかし、Schemeではこの継続を他の数値や手続きのようなオブジェクトと同様に
扱うことができるのです。次で説明するcall-with-current-continuationが
その継続を扱う手続きです。