继续发躺在邮箱里死掉的文章……
----------------------------
(define factorial
(lambda (x)
(if (= x 0)
(call/cc (lambda (k) (set! retry k) 1))
(* x (factorial (- x 1))))))
這裡定義了一個階乘,而continuation位於階乘遞歸展開后的最後一步。
以x=4為例子,執行如下語句得到:
(factorial 4)
=> 24
(retry 6)
=> 144
其中,第一句執行時,展開應該為:
4*3*2*1*1
|
*得到的continuation在這裡* 最後的1是call/cc的返回值
因此,當我們保存了這個continuation到retry時,
再次應用retry到某個數,如上例的6,則返回到剛才的計算中,
此時計算已經進行到4*3*2*1*?
最後的?應該是call/cc的返回值,因為我們應用retry到6,所以這時最終的展開式變為
4*3*2*1*6
因此,求值得到了144.
理解:在call/cc里,每次apply continuation的變量名(記為cont)到某個值時,從call/cc返回,並且返回值是這個值。
當再次apply cont到某個值時,這個值作為call/cc的返回值,回到call/cc(continuation)定義的地方繼續執行。
No comments:
Post a Comment