2009-04-16 61 views
5

所以我相信我現在理解延續,至少在某種程度上,歸功於community scheme wikiLearn Scheme in Fixnum Days尋找人爲的例子代碼:continuations!

但是我想要更多的練習 - 也就是說,我可以在腦海中完成更多的示例代碼(最好是人爲設計的,所以沒有多餘的東西來分散這個概念)。

特別是,我想解決繼續恢復和/或協程的更多問題,而不是僅僅使用它們退出循環或其他任何(這是相當簡單的)。無論如何,如果你知道除了上面鏈接的教程外還有很好的教程,或者如果你想發佈你寫的東西,這將是一個很好的練習,我會非常感激!

回答

5

是的,延續可以是相當令人費解的。這裏有一個很好的拼圖,我發現了一段時間後 - 揣摩集團的印刷什麼,以及爲什麼:這是如何工作

(define (mondo-bizarro) 
    (let ((k (call/cc (lambda (c) c)))) ; A 
    (write 1) 
    (call/cc (lambda (c) (k c))) ; B 
    (write 2) 
    (call/cc (lambda (c) (k c))) ; C 
    (write 3))) 

(mondo-bizarro) 

說明(含劇透!):

  1. 第一call/cc店返回它自己的延續並將其存儲在k中。
  2. 編號1被寫入屏幕。
  3. 當前的延續,這是繼續在B點,返回到K,這返回到
  4. 這一次,K,必定將我們在B處
  5. 得到了延續數1再次被寫入屏幕
  6. 當前的延續,這是繼續在B點,返回到K,這是另一個(但不同的)延續到另一個點B
  7. 一旦我們回到原來的延續,它是重要的是要注意,這裏k仍然是必然的A
  8. 數量2寫入屏幕
  9. 當前的延續,這是繼續在C點,返回到K,這返回到
  10. 這一次,K,必定將我們在得到了延續ç
  11. 1再次寫入到屏幕
  12. 當前的延續,其是繼續在B點,則返回到k,它返回到C
  13. 3被寫入到屏幕
  14. And you're done

因此,正確的輸出是11213。我用粗體文字寫出了最常見的問題 - 重要的是要注意,當使用延續來重置k值時,它不會影響原始延續中k的值。一旦你知道它變得更容易理解。

+0

嗯,是的,這是在摧毀我的大腦。 csi說結果是11213,但我只能理解'112'......我一定錯過了一些東西! – 2009-04-16 22:39:54