« Home

call/cc [rkt-0003]

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