2012-01-15 11 views

回答

2

apply適用的功能,一些參數:

(apply + 1 2 3) 
;=> 6 

eval計算表達式:

(eval '(+ 1 2 3)) 
;=> 6 
+0

要知道,像Common Lisp的和Emacs-Lisp的一些Lisp的需要'+'被應用之前的報價。否則,他們會嘗試評估它。 – Daimrod 2012-01-15 17:17:00

5

EVAL執行由Lisp的數據結構的任意的源代碼。這包括函數調用,宏觀形式,特殊形式,變量和自我評估數據。

APPLY應用一個函數的參數列表。

5

什麼更好的方式去理解它,而不是看看實際執行!請參閱自循環直譯器部分SICP,它有兩個evalapply的內部運作一個非常明確的解釋。從書中引用:

評估和演示需要作爲參數的表達和的環境。它對錶達進行分類並指導其評估。 Eval的結構是對待評估表達式的語法類型的案例分析。爲了保持程序的一般性,我們抽象地表達了對錶達式類型的確定,不承諾對各種類型表達式的任何特定表示。每種類型的表達式都有一個測試它的謂詞和一個用於選擇其部分的抽象手段。這種抽象語法可以很容易地看到我們如何通過使用相同的評估程序來更改語言的語法,但使用不同的語法過程集合。

應用需要兩個參數,一個過程和過程應該應用到的參數列表。將分類過程應用於兩種:它調用apply-primitive-procedure來應用基元;它通過順序評估組成過程主體的表達式來應用複合過程。用於化合物過程體的評價環境通過延伸通過的方法進行的鹼環境中包括結合該過程的參數,以向所述程序是要應用的參數的框架構成。

+2

Common Lisp'eval'實際上並不需要環境參數。它在當前動態環境和空詞彙環境中評估其表達式參數。 – 2012-01-16 16:21:49

相關問題