2011-05-30 106 views
4

假設,有一個reset塊用單shift移位位於重置塊中的位置是否重要?

val r = reset { 
    // do smth. 1 
    shift {...} 
    // do smth. 2 
    // do smth. 3 
}

它是正確的,我把經過「做未便2」或「做3水木清華」的shift不改變結果rshift代表reset區塊在哪裏並不重要?

回答

7

這很大程度上取決於您在shift內製作的內容。如果你只是調用這樣的提供的函數:shift((k: Unit => Unit) => k(Unit))那麼,在你的具體例子中,shift的位置確實無關緊要。

Shift函數只捕獲其他函數中的代碼(在我的示例中,該函數被稱爲k)。換句話說,此代碼:

val r = reset { 
    // do smth. 1 
    shift((k: Unit => Unit) => k(Unit)) 
    // do smth. 2 
    // do smth. 3 
} 

會被編譯器是這樣的(這個代碼只是演示了總體思路和它不應該表現出什麼樣的編譯器插件將實際產生)被改寫:

val k = (Unit => Unit) => { 
    // do smth. 2 
    // do smth. 3 
} 

val r = { 
    // do smth. 1 
    k(Unit) 
} 

但是如果你在shift裏面有一些邏輯,比如有條件的k的執行,那麼這個shift的位置確實很重要。

希望這有助於(我希望,我理解正確你的問題)

+0

是的,它確實有助於你理解我的questio正確。 – Michael 2011-05-31 05:33:12

1

只是增加了已經給出了答案,在地方,你可以四處走動shift是是否有碼移位之前還是有它在函數內部傳遞給shift

reset { 
    foo(); bar(); 
    shift { k => stuff } 
    baz() 
} 

相同

reset { 
    foo(); 
    shift { k => bar(); stuff } 
    baz() 
}