(list '+ 3 5)
(+ 3 5)(列表(列表....))
(list (+ 3 5))
(8)
(list (list '+ 3 5))
((+ 3 5))
爲什麼第三行的結果與第二行的結果不同?
(list '+ 3 5)
(+ 3 5)(列表(列表....))
(list (+ 3 5))
(8)
(list (list '+ 3 5))
((+ 3 5))
爲什麼第三行的結果與第二行的結果不同?
在第二個例子中,(+ 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)
。
(有更精確的方式說一些這一點,但我試圖使對方瞭解思想初學者。)
列表是創建一個從它的參數列表的功能。 當s表達式被評估Lisp檢查它的第一個元素,如果它是一個函數(LIST是一個函數),它首先遍歷列表中的每個元素,評估它們並將值作爲參數傳遞給函數。
在第二行中,您將內部表單(即(+3 5))評估爲8,而外部(列表)調用創建包含1個元素的列表。
在第三行中,您將內部調用列表作爲一個值列舉爲3元素列表(+ 3 5)。它不是一個形式lisp會進一步評估,你只是創建了符號+作爲頭的列表。評估外部列表調用將給出另一個1元素列表(其包含3元素列表作爲頭部)。
希望它有幫助。
因爲它是不同的代碼...? – imulsion 2013-03-24 17:21:25
請編輯你的問題,並將其改爲有意義的標題! – Joel 2013-10-07 08:46:08