[英]Understanding undelimited continuations
假設我有以下代碼(采用類似C的語法):
void foo(int arg) { ... } int bar() { ... // call with continuation ... } foo ( bar() ) // after foo invocation
1)函數foo
調用功能bar
,該功能bar
一直運行到到達call with continuation
止。
2)在這一行,創建了continuation
功能。 它代表bar
和foo
的其余部分。 continuation
函數作為自變量傳遞,以call with continuation
函數進行call with continuation
。
3) call with continuation
函數的call with continuation
對參數做任何想做的事情(例如,它可能只存儲在全局變量中)並返回。
4)一旦call with continuation
的call with continuation
返回,我們將立即跳轉到“在foo調用之后”這一行,而bar
和foo
的其余部分將不執行。
5)為了繼續執行bar
和foo
我們應該顯式調用continuation
函數(在(2)中創建並且可能存儲在(3)中)。 一旦調用了continuation
函數,則在call with continuation
的call with continuation
之后立即繼續執行。
這是正確的嗎? 我是否缺少有關無限延續的信息?
不會。通常,無界的延續(例如,使用Scheme的call/cc
創建)在您調用continuation
時會跳轉,而不是在您調用call/cc
(又call-with-current-continuation
調用”)時跳轉。
因此,充實您的示例:
continuation savedk;
void foo(int arg) { ... }
int bar() {
...
call/cc(handler)
// after call/cc
println "after call/cc"
...
}
void handler(continuation k) {
savedk = k
}
foo ( bar() )
// after foo invocation
執行開始。 我們輸入bar
(我們還沒有輸入foo
;當我們完成bar
時,我們將這樣做)。
當我們點擊bar
call/cc
,“程序上下文”將變成一個稱為延續的對象。 此時,程序上下文包括“完成執行bar
,然后對結果調用foo
,然后執行foo
調用之后執行的所有操作”。 延續被傳遞給作為call/cc
參數的handler
在上面的示例中是handler
。
handler
對延續執行一些操作。 假設它將其存儲在全局變量中。 然后它返回到call/cc
調用之后的點,仍然在bar
。
假設我們在這一點上打印出一些東西。 然后bar
完成,我們稱為foo
,它完成了。
如果現在在savedk
應用延續,則控制跳回到bar
並將程序上下文恢復為“完成執行bar
,然后對結果調用foo
,然后執行foo
調用之后執行的所有操作”。 這樣我們又打印了一行。 事實上,如果我們不清除savedk
變量或測試其他一些國家,我們可能得到一個無限循環,如果“做后無堅不摧foo
調用”是呼savedk
了!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.