Sunday, September 26, 2010

THE SCHEME PROGRAMMING LANGUAGE里面一个continuation的例子

继续发躺在邮箱里死掉的文章……

----------------------------

(define retry #f)

(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: