簡體   English   中英

了解無限延續

[英]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功能。 它代表barfoo的其余部分。 continuation函數作為自變量傳遞,以call with continuation函數進行call with continuation

3) call with continuation函數的call with continuation對參數做任何想做的事情(例如,它可能只存儲在全局變量中)並返回。

4)一旦call with continuationcall with continuation返回,我們將立即跳轉到“在foo調用之后”這一行,而barfoo的其余部分將不執行。

5)為了繼續執行barfoo我們應該顯式調用continuation函數(在(2)中創建並且可能存儲在(3)中)。 一旦調用了continuation函數,則在call with continuationcall 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
  1. 執行開始。 我們輸入bar (我們還沒有輸入foo ;當我們完成bar時,我們將這樣做)。

  2. 當我們點擊bar call/cc ,“程序上下文”將變成一個稱為延續的對象。 此時,程序上下文包括“完成執行bar ,然后對結果調用foo ,然后執行foo調用之后執行的所有操作”。 延續被傳遞給作為call/cc參數的handler在上面的示例中是handler

  3. handler對延續執行一些操作。 假設它將其存儲在全局變量中。 然后它返回到call/cc調用之后的點,仍然在bar

  4. 假設我們在這一點上打印出一些東西。 然后bar完成,我們稱為foo ,它完成了。

  5. 如果現在在savedk應用延續,則控制跳回到bar並將程序上下文恢復為“完成執行bar ,然后對結果調用foo ,然后執行foo調用之后執行的所有操作”。 這樣我們又打印了一行。 事實上,如果我們不清除savedk變量或測試其他一些國家,我們可能得到一個無限循環,如果“做后無堅不摧foo調用”是呼savedk了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM