call/cc 這個函數是 call with current continuation 的意思,比如說在下面的程式碼中
(* 2 1)
1 的 continuation 就是把 1 挖掉留下的 (* 2 hole),故下列程式碼
(* 2 (call/cc (λ (k) (k 1))))
的結果是 2。讀者可以想像 k = λ (hole) (* 2 hole),這在實作上不太正確,但對理解很有幫助。
一般來說,racket 的函數會簡單的寫成
(define (f params ...) stmt1 ... stmtn)
如果我在其中安放一個 call/cc 會發生什麼事呢?
(define (f params ...) ... (call/cc (λ (k) ...)) stmtk ...)
答案是 k = λ () (begin stmtk ... stmtn)。由於 racket 自動把
stmt1 ... stmtn
包裝成 (begin stmt1 ... stmtn),而
(begin stmt1 stmt2 ...)
中 stmt1 的 continuation 是 (begin stmt2 ...),以此類推就很容易理解 k 等於什麼了。