Schemeは継続(continuation)という、たいへん強力で柔軟な制御機構を備えています。継続を用いれば大域脱出、コルーチン、疑似マルチタスク、バックトラックといった特殊な制御を必要とするプログラムを効率的に記述することができるのです。しかし一方でその抽象度の高さから、「継続は難しいもの」という印象も強いようです。
ここでは継続の正確な定義はとりあえず後に回し、直感的な観点から継続を導入してみたいと思います。
話を簡単にするため、今全ての手続きが1-in/1-outであるような1-Schemeというものを考えます。例えば：
 (define (double x) (* x x))
   (double 2) => 4
 
 (define (add1 x) (+ x 1))
   (add1 2) => 3
のような手続きが1-Scheme手続きです。
----
  (define (f x y) (* x y))
 
  (lambda (X)
    (lambda (Y)
       (f X Y)))
----
1-in/1-out手続きf,g,hを考えると、あらゆる1-Schemeプログラムは本質的に次のような形をもつと考えられます。
 (h (g (f 入力)))  => 結果
つまり前の手続きの出力が次の手続きの入力として渡され、それが連なって最終結果が導かれるわけです。パイプラインに似ていますね。
ところで、これは次のように図式化できます。
 入力 => [ f => g => h ] => 結果
ここで少し細工をして
 入力 => [ f => 1 => h ] => 結果
としたらどうでしょうか。つまりgで計算をする替わりに前後の脈絡なく1をhに渡してしまうわけです。考えて見れば、これは部品の差し替えが起こるだけでプログラム全体の進行には大して影響がないことが分かります。それどころか、「特別な場合にgの計算を省略したい」といったニーズにたいへん便利に見えます。
こういう差し替えを行うにはパイプラインを監視すればよさそうです。つまり「基本的には前の手続きの入力を次に渡すのだが、必要なら替わりの値を流し込んでもいい」というルールがあれば部品の差し替えと同じことが実現できます。これはつまり図式の => にアクセスする手段があるということになります。
=> とはなんでしょうか。
まず
であることが分かります。よく考えるとこれは1-in/1-outの手続きそのものです。そして「前の値」とは、ある手続きの計算結果のことですから、
ということが言えます。最後に流し込みのルールを追加します。
このような性質を持った => を「継続手続き」といいます。そして、ある手続きを呼び出す時に、すぐ後ろの継続手続を取り出す手段がSchemeには用意されているのです。これはcall-with-current-continuationあるいは省略してcall/ccと呼ばれています。
Schemeの仕様書R5RSによれば、継続の正確な定義はこうです。
[訳] Schemeの式が評価される時、そこには評価の結果を待つ継続が一つ待機している。継続は計算の(デフォルトの)未来全体を表している。
デフォルトの未来全体とは、ずいぶん持って回った言い方です futureに未来の役を当てましたが、GoFのデザインパターンのFuture パターンに相当します。。
これは継続手続きが連なるパイプラインの先を何であれ継続と考える、ということを意味します。実行型プログラムであればプログラムの終了までですし、対話環境なら「次の入力を受け取ってそれを解釈しまた次の・・」という繰り返しを(少なくとも概念上)継続全体としてとらえます。
ここで注意しなければならないのは、一端取り出した継続手続きは、他の手続きとなんら変わるところがない、ということです。再び上の例を考えます。
上の例を字句通りに書くと次のようになります。
 (h
   (call/cc
     (lambda (cont-proc) ;; 継続手続きをとり出す
        (let ((v (f 入力)))
          (cont-proc 1)      ;; 継続手続きに1を渡す
          (g v)                    ;; ここでgを呼び出しているが、
       ))))                         ;; 直前の継続手続きで脱出してしまうため、実際には実行されない
 
 => (h 1)
ここでcont-procは単なる手続きなので、適当な変数に代入すれば後から再利用できてしまうのです。
 (define reuse #f)
 (h
   (call/cc
     (lambda (cont-proc)
       (let ((v (f 入力)))
        (set! reuse cont-proc)
        (g v)                  ;; 今度はcont-procを呼び出していないので普通に手続きは終了する
      ))))
 
 => (h (g v))
その後適当なタイミングでcontを呼び出すことができます。
 (reuse 1)
 => (h 1)
このような場合、単に再開手続きを呼ぶだけではあまり意味がないので、脱出用の継続手続きを同時に用意して処理の中断を行うケースが多いでしょう。
 (define (re-entrant stop-cont)
   (call/cc
     (lambda (continue)
       (stop-cont continue))) ;; 再開用の手続きを渡して一端終了
   (continued-body)            ;;continueが呼び出されると実行される
   ...
 )
以上をまとめると、継続の基本的な作用は次の二つになります。
Schemeの継続は基本的に「一入力の手続き」です。ただし真の多値であるvalues手続きをもつ関係上、「call-with-valuesの直下で呼び出されたcall/ccはn入力の継続手続きを生成する」と規定されています。
「継続」という概念は必ずしもScheme固有のものではないのですが、Schemeとワンセットで扱われることが多いようです。理由は色々ありますが、
などが考えられます。