scheme 修行では早々に継続(letcc)が出てくる。
(define rember-upto-last (lambda (a lat) (let/cc skip (letrec ((R (lambda (lat) (cond ((null? lat) (quote ())) ((eq? (car lat) a) (skip (R (cdr lat)))) (else (cons (car lat) (R (cdr lat)))))))) (R lat)))))
これはリストの中の指定した要素以降のリストを返す(要素が見つからなければすべてのリストを返す)
gosh> (rember-upto-last 'three '(one two three four five)) (four five)
なんでも継続によれば継続とは
「現在の計算を続行するための情報」
とある。つまりこれが継続ということだが、Scheme修行では別の表現がされていた(p.43)
letcc hopを通り過ぎたあと、(hop M)に遭遇する前にすべきだったことを忘れなさい。そしてMが何であっても まるで (letcc hop M)の値を求めたかのようにふるまいなさい
上のコードでは、skip (R (cdr lat))を通るときに今まで計算してきた情報を捨てて、(R (cdr lat))を実行する。つまり現在の計算を続行するための情報 を伴ってRにジャンプしている。