6

我猜delimitedundelimited延續之間的區別就像calljump之間的區別。定界和非定界延續之間的區別

如果我們調用delimited繼續它將返回給調用者一旦完成。如果我們調用undelimited延續它就像goto一樣工作,永遠不會返回給調用者。

它有道理嗎?我錯過了什麼嗎?

回答

7

你有點偏離軌道。任何一種風味的延續都與goto(跳躍)沒有多大關係。然而,他們與堆棧有關。


經典延續

記住定期延續捕獲控制堆棧的概念作爲第一類值。棧可以被命名,作爲參數傳遞,值可以被應用於它們,通過callCC通過基於功能應用的簡單API來產生控制流的變化。

分隔延續

什麼分隔延續加進來?

回想一下,定期延續捕獲整個調用堆棧到某個點。如果我們可以將標記放入連續控制堆棧中捕獲多少控制堆棧呢?控制堆棧的一種「劃界」。

這就是這個想法,現在你有超酷的定界延續:定界,捕獲和操作程序的任意部分,作爲一個值。完美的恢復和增量處理,以及其他棘手的控制流形式。

參考

Oleg Kiselyov一些修改,收到關閉名單:

+1

關於'J',請參閱Danvy,Shan和Zerny的「J is for JavaScript:Algol-like languages和JavaScript using first-class continuations之間的直接對應關係」:http://www.cs.rutgers。 EDU /〜ccshan/J/dsz.pdf – sclv 2011-05-24 15:30:22

2

作爲語言功能的延續(與作爲編程模式的延續相對)是控制上下文(「棧」)的(部分)的變化。正如唐所說,無限延續代表了整個背景,而分界延續只代表了其中的一部分。

通常情況下,捕獲無限延續(例如,使用call/cc)不會更改控制上下文;控制上下文僅在調用延續時(即反映到堆棧上)纔會更改。

通常,捕捉分隔延續(例如,shift)立即中斷控制上下文起來到最近的分隔符段(例如,reset)和具體化,作爲似乎是一個普通的舊功能(儘管它可能被實施爲堆疊欺騙,而不是普通的功能被實現)。

順便說一句,延續有時被稱爲「第一類跳躍」,但這並不意味着它們與正常函數調用相比,更多地與jmp指令有關。