2010-06-27 42 views
2

這在方案一怪功能:機制方案的功能的

(將f (呼叫/立方厘米 (拉姆達(x)x)))

(((F「F )f)1)

當在命令行中調用f時,顯示的結果是f。 這種機制的解釋是什麼?

謝謝!

回答

3

你剛剛偶然發現了'延續',可能是計劃中最難理解的東西。

call/cccall-with-current-continuation的縮寫,該過程所做的是將單個參數函數作爲自己的參數,並用當前的「繼續」調用它。

那麼什麼是延續?這是非常難以解釋,你應該谷歌它得到比我更好的解釋。但是延續僅僅是一個論點的功能,它的主體代表了價值的某種「延續」。如果我們有(+ 2 (* 2 exp))而exp是一個隨機表達式,如果我們評估該表達式,則存在等待該結果的「延續」,評估繼續進行的地方,如果它評估爲3,則插入價值轉化爲表達式(* 2 3),並從那裏繼續下一個「繼續」,或繼續進行評估的地方,即(+ 2 ...)

在幾乎所有的編程語言環境中,計算值與其開始位置相同的地方是相同的,但許多語言中的return語句是一個關鍵的反例,其延續與完全不同返回語句本身。

在Scheme中,你可以直接控制你的延續,你可以像在那裏一樣捕獲它們。 f所做的只不過是對當前的延續進行評估,畢竟當(lambda (x) x)被當前延續調用時,它只是對它進行評估,因此整個函數體都會這樣做。正如我所說的,延續是功能本身,它們的身體可以被看作是它們將要捕獲的延續,這被設計師着名地表明,延續只是簡單的lambda抽象。

所以在代碼f中首先評估它被稱爲的延續。然後,作爲函數的這個延續應用於'f(符號)。這意味着那個符號被帶回到那個繼續,在那裏它被再次評估爲一個符號,以揭示它所綁定的函數,它又被一個符號作爲它的參數調用,最後被顯示。

一種令人震驚的,如果你看過電影「底」,這也許解釋了它:

http://thisdomainisirrelevant.net/1047

+0

非常感謝你的解釋和鏈接! – shaku 2010-06-27 18:50:48