call/cc分析一例

來源:互聯網
上載者:User

標籤:io   sp   on   cti   工作   ef   as   程式   return   

(define (fact n)  (let ((r 1) (k ‘void))    (call/cc (lambda (c) (set! k c)))     (set! r (* r n))    (set! n (- n 1))    (if (= n 1) r (k ‘recurse))))(fact 5)老師:為什麼能工作?學生:不知道!老師:(call/cc (lambda (c) (set! k c))) 幹了什嗎?學生:call/cc 的全稱是 call-with-current-continuation, 它調用一個單參數的函數,調用時把當前延續作為那個單參數函數的參數。 所以,上式就是把當前延續存入 k 中。老師:當前延續是什嗎?學生:(escaper (lambda (~) (~ (set! r (* r n)) (set! n (- n 1)) (if (= n 1) r (k ‘recurse)))))老師:怎麼存入 k ?學生:(set! k (escaper (lambda (~) (~ (set! (* r n)) (set! n (- n 1)) (if (= n 1) r (k ‘recurse))))))老師:(call/cc (lambda (c) (set! k c))) 和 (set! k (escaper (lambda (~) (~ (set! (* r n)) (set! n (- n 1)) (if (= n 1) r (k ‘recurse)))))) 等價嗎,可以相互替換嗎?學生:可以!(define (fact n)  (let ((r 1) (k ‘void))    (set! k           (escaper (lambda (~) (~ (set! (* r n)) (set! n (- n 1)) (if (= n 1) r (k ‘recurse)))))) ;; A    (set! r (* r n)) (set! n (- n 1)) (if (= n 1) r (k ‘recurse))))                               ;; B老師:為什麼能工作?學生:跟蹤一下 (fact 5) 就知道了B: n=5 => r=5,  n=4  [ n != 1,continue ]A: n=4 => r=20, n=3  [ n != 1, continue ]A: n=3 => r=60, n=2  [ n != 1, continue ]A: n=2 => r=60, n=1  [ n == 1, return r and escape ]老師:為什麼是遞迴的?學生:因為延續是一種函數,延續遞迴了,這個延續函數就遞迴了。老師:這裡的延續本質上還是遞迴。儘管延續被叫做有內容相關的 goto,這個程式也可以看成用了 goto 的。(define (fact n)  (let ((r 1) (k ‘void))    (call/cc (lambda (c) (set! k c)))    (set! r (* r n))    (set! n (- n 1))    (if (= n 1)        r        (k ‘recurse) ;; => go back to (call/cc (lambda (c) (set! k c)))        )))學生:但這隻是一種“比喻”,實質上它是遞迴!老師:你說的對。

call/cc分析一例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.