我學習口齒不清,但有一點我不明白的是爲什麼是必要的#」使用。如果存在具有特定名稱的函數,爲什麼lisp會認爲它是一個變量? 例如:
>(remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10))
(2 4 6 8 10)
我學習口齒不清,但有一點我不明白的是爲什麼是必要的#」使用。如果存在具有特定名稱的函數,爲什麼lisp會認爲它是一個變量? 例如:
>(remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10))
(2 4 6 8 10)
一些lisp,像Common Lisp,需要這樣做。其他人,如Scheme,則不。
您需要這樣做,因爲您正在使用的Lisp具有用於函數的單獨命名空間與「正常」變量。如果您遺漏了#'
,那麼符號evenp
將被解釋爲指的是「正常」(非功能)名稱空間。
感謝您的快速響應。我不知道lisp是這樣分開的,至少在lisp中是這樣。非常感激。 – Andy 2012-03-07 04:03:02
讀語法
#'X
意味着完全相同的事情
(FUNCTION X)
(FUNCTION X)表示,大約,「解決的命名空間中的符號X功能」。沒有這個,X被評估爲一個變量。 Common Lisp中的函數和變量位於不同的名稱空間中。這是一條規則。
至於這個問題,爲什麼Lisp會認爲它是一個變量?換句話說:假設有兩個命名空間,爲什麼Lisp不能自動地在一個或另一個上自動回退(如果沒有歧義)?原因在於,與Lisp-1或Lisp-2相比,這將是一次黑客攻擊,比其中任何一個都更糟。 Lisp-1和Lisp-2是Lisp文化中使用的詞,指的是變量有單一名稱空間的方言,以及有兩個變量的方言。
如果您想了解更多關於這種或那種做法的優點和缺點,本文由Kent Pitman和Richard Gabriel撰寫:http://www.nhplace.com/kent/Papers/Technical-Issues.html [功能細胞和價值細胞分離的技術問題]。另外:您可以使用'FUNC或(QUOTE FUNC):(刪除 - 如果不是'evenp ...)。這是一個非常晚的綁定機制,它貫穿符號,並且不適用於詞法函數。它可能不會非常有效地編譯。通過'FUNC調用總是必須通過符號進行查找,而#'FUNC(至少在某些重要情況下)可以進行優化。
感謝您的回覆。這個例子來自我正在使用的書,所以我不會在我的代碼中使用它,但我很欣賞這些建議。 – Andy 2012-03-07 04:05:16
這已被回答之前:http://stackoverflow.com/questions/4873810/what-does-mean-in-lisp – 2012-03-07 06:25:35
我很抱歉。我應該刪除我的列表嗎? – Andy 2012-03-07 06:36:42