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 等於什麼了。