2009-07-13 56 views
7

這與What is call/cc?有關,但我不想爲了自己的目的劫持這個問題,並且像setjmp/longjmp的類比這樣的一些參數可以迴避我。通話細節/ cc

我想我對繼續是什麼有足夠的想法,我認爲它是當前調用堆棧的快照。我不想討論爲什麼這可能會很有趣,或者你可以用延續來做什麼。我的問題更具體地說,爲什麼我必須提供一個函數參數來調用/ cc?爲什麼不叫/ cc只是返回當前的延續,所以我可以隨心所欲地做任何事情(存儲它,稱它,你的名字)?在從另一個問題(http://community.schemewiki.org/?call-with-current-continuation-for-C-programmers)的鏈接中,它談到了「基本上它只是一個乾淨的方式來獲得延續給你,並阻止後續跳回到保存的點。」,但我沒有得到它。似乎不必要的複雜。

+0

看着這個主題,我完全不清楚你以後的事情,以及爲什麼你找到了LtU的帖子照亮。也許你可以編輯這個問題來更好地解釋這些問題? – 2009-12-09 14:05:40

+0

我認爲這個問題仍然反映了我正在努力解決的問題,這可能是LtU海報的「測試」一詞,與我一起使用,因爲它讓我想到了簡單地返回延續的後果,當你調用它。問題中的schemewiki.org網址的引用基本上涵蓋了所有這些,但正如我之前所說,我沒有得到它。這是對的,但我沒有「看到」。理解不是線性依賴於信息,有時它需要一個轉折點。 – ThomasH 2009-12-10 10:14:57

+0

好吧,明白了!關於理解這條曲折道路的觀點是公平的,但試圖回答一個問題有點令人沮喪,而且無法弄清楚提問者爲什麼拒絕這個問題。 – 2009-12-11 08:34:36

回答

2

反對常見的SO網絡禮儀我正在回答我自己的問題,但更多的是作爲編輯而不是答案的提供者。

過了一段時間,我開始了一個類似的問題,在LtU。畢竟,這些人是一整天都在思考語言設計的人,是不是他們,其中一個answers終於和我一起踢了。現在這裏提到的東西,例如通過Eli或原始問題,對我來說更有意義。這是所有關於什麼被包含在延續,其中施加的延續將在

其中posters在LTU寫道:

「你可以看到究竟是如何調用/立方厘米讓你」保持在em或get/cc中,你需要做一些測試來確定你是否有反跳或者只是初始調用,基本上,call/cc保持繼續使用延續,而對於get/cc或em,continuation包含它的用法,所以(通常)需要在continuation的開始處(即緊跟在get/cc/em之後)添加一個測試以分隔「使用連續部分」從「繼續」的其餘部分。「

它開車回家給我。

謝謝你們!

2

這將不太靈活。如果你想要的行爲,你可以這樣做:

(call/cc (lambda (x) x)) 

你可以看看在延續的示例用法與當前持續形態‘的模式語言8日電話會議「達雷爾·弗格森和德懷特Deugo。’的程序。2001年9月。「 (http://library.readscheme.org/page6.html)並嘗試使用上面定義的call/cc-return來重寫它們。

+0

感謝您展示我如何降低到這個角落的情況。但我想要一個解釋,而不是解決方案。 – ThomasH 2009-07-13 15:05:54

9

如果你使用像傑伊表演這樣的結構,那麼你可以抓住延續,但是在某種程度上,抓住的價值已經被破壞了,因爲你已經在延續。相比之下,call/cc可用於抓取繼續,即仍在以外的當前表達式。例如,延續的最簡單的用途之一是實現一種的abort的:

(call/cc (lambda (abort) 
      (+ 1 2 (abort 9)))) 

你不能做到這一點與操作你描述。如果你嘗試它:

(define (get-cc) (call/cc values)) 
(let ([abort (get-cc)]) (+ 1 2 (abort 9))) 

然後你得到一個關於申請9作爲一個過程的錯誤。這是因爲abort跳回let9新的價值 - 這意味着,你現在在做第二輪的相同添加表情,只是現在abort勢必9 ......

兩個其他相關說明:

  1. 有關延續的很好的實用介紹,請參閱PLAI
  2. call/cc有點複雜,因爲它具有功能 - 概念上更易於使用的結構是let/cc,您可以在PLT Scheme等某些實現中找到它。上面的例子變成(let/cc abort (+ 1 2 (abort 9)))
+0

所以,你說我的問題,是(a)如果延續立即返回它是「被寵壞」,因爲我在延續。但除非我打電話,否則我不能進入延續。如果延續是一流的價值觀,他們不能通過傳遞給他們,他們可以嗎?! 然後,你說(b)call/cc會獲得一個「未決」延續。價值如何可以待定?你也可以說(c)延續是在當前表達之外。我不太明白。持續捕獲多少錢?一切盡在但不包括呼叫/ cc?的呼叫? – ThomasH 2009-07-14 11:15:22

2

我建議先問自己:做一流的延續意味着什麼?

表達式的延續本質上由兩部分數據組成:首先是表達式的閉包(即環境)其次,表達應該對錶達結果做些什麼。然後,具有一流延續的語言是一種具有封裝這些部分的數據結構的語言,它將這些數據結構視爲任何其他結構。

call/cc是一個特別優雅的方式來實現這個想法:當前的繼續被打包成一個過程,它封裝了將要完成的事情與表達式,表達;以這種方式來表示延續只是意味着這個過程的關閉包含了它被調用的地點的環境。

你可以想象在其他方面實現一流延續的想法。他們不會被稱爲/ cc,我很難想象這樣的表示如何更簡單。

在臨別筆記,可以考慮讓/ CC以利所說,我寧願調用bind /立方厘米的實現:

(define-syntax bind/cc 
    (syntax-rules() 
     ((bind/cc var . body) 
      (call/cc (lambda (var) . body))))) 

而且作爲一個練習,你將如何實現呼叫/ cc,基於結合/ cc的?