2013-03-24 71 views
-2
(list '+ 3 5) 

(+ 3 5)(列表(列表....))

(list (+ 3 5)) 

(8)

(list (list '+ 3 5)) 

((+ 3 5))

爲什麼第三行的結果與第二行的結果不同?

+1

因爲它是不同的代碼...? – imulsion 2013-03-24 17:21:25

+1

請編輯你的問題,並將其改爲有意義的標題! – Joel 2013-10-07 08:46:08

回答

2

在第二個例子中,(+ 3 5),評估數字3和5,然後通過將與符號+相對應的函數應用於數字3和5來評估整個表達式。這就是爲什麼你不需要在第一個例子中添加'給他們。)

在第一個例子,Lisp的評估'+(這會導致符號+)以及3和5,然後應用功能list給他們,它只不過是創建它的(評估)參數列表。

第三個例子對內部列表做了同樣的事情:就像在第一個例子中一樣,對整個事物進行評估。這導致(+ 3 5)。然後,將函數list的外部實例應用於此結果,並在其周圍封裝另一個列表。

取而代之的是第三個例子,也許你想這樣的:

(list (funcall #'+ 3 5)) 

在這種情況下,#'告訴Lisp中去,並得到與+相關的功能。 Common Lisp通常以不同於存儲常規符號值的方式存儲函數。鑑於符號的正常評估獲得常規符號值,評估#'your-symbol獲取相關函數(如果存在)。

然後funcall應用於的用#'+至3和5。然後該操作的值被傳遞給list得到的函數,以產生(8)

(有更精確的方式說一些這一點,但我試圖使對方瞭解思想初學者。)

0

列表是創建一個從它的參數列表的功能。 當s表達式被評估Lisp檢查它的第一個元素,如果它是一個函數(LIST是一個函數),它首先遍歷列表中的每個元素,評估它們並將值作爲參數傳遞給函數。

在第二行中,您將內部表單(即(+3 5))評估爲8,而外部(列表)調用創建包含1個元素的列表。

在第三行中,您將內部調用列表作爲一個值列舉爲3元素列表(+ 3 5)。它不是一個形式lisp會進一步評估,你只是創建了符號+作爲頭的列表。評估外部列表調用將給出另一個1元素列表(其包含3元素列表作爲頭部)。

希望它有幫助。