我猜delimited
和undelimited
延續之間的區別就像call
和jump
之間的區別。定界和非定界延續之間的區別
如果我們調用delimited
繼續它將返回給調用者一旦完成。如果我們調用undelimited
延續它就像goto
一樣工作,永遠不會返回給調用者。
它有道理嗎?我錯過了什麼嗎?
我猜delimited
和undelimited
延續之間的區別就像call
和jump
之間的區別。定界和非定界延續之間的區別
如果我們調用delimited
繼續它將返回給調用者一旦完成。如果我們調用undelimited
延續它就像goto
一樣工作,永遠不會返回給調用者。
它有道理嗎?我錯過了什麼嗎?
你有點偏離軌道。任何一種風味的延續都與goto
(跳躍)沒有多大關係。然而,他們與堆棧有關。
經典延續
記住定期延續捕獲控制堆棧的概念作爲第一類值。棧可以被命名,作爲參數傳遞,值可以被應用於它們,通過callCC
通過基於功能應用的簡單API來產生控制流的變化。
分隔延續
什麼分隔延續加進來?
回想一下,定期延續捕獲整個調用堆棧到某個點。如果我們可以將標記放入連續控制堆棧中捕獲多少控制堆棧呢?控制堆棧的一種「劃界」。
這就是這個想法,現在你有超酷的定界延續:定界,捕獲和操作程序的任意部分,作爲一個值。完美的恢復和增量處理,以及其他棘手的控制流形式。
參考
注
從Oleg Kiselyov一些修改,收到關閉名單:
J
運營商正是爲此目的而推出的; J是call/cc的前身。請參閱An Introduction to Landin’s 「A Generalization of Jumps and Labels」作爲語言功能的延續(與作爲編程模式的延續相對)是控制上下文(「棧」)的(部分)的變化。正如唐所說,無限延續代表了整個背景,而分界延續只代表了其中的一部分。
通常情況下,捕獲無限延續(例如,使用call/cc
)不會更改控制上下文;控制上下文僅在調用延續時(即反映到堆棧上)纔會更改。
通常,捕捉分隔延續(例如,shift
)立即中斷控制上下文起來到最近的分隔符段(例如,reset
)和具體化,作爲似乎是一個普通的舊功能(儘管它可能被實施爲堆疊欺騙,而不是普通的功能被實現)。
順便說一句,延續有時被稱爲「第一類跳躍」,但這並不意味着它們與正常函數調用相比,更多地與jmp
指令有關。
關於'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