2012-03-07 104 views
0

可能重複:
What does # mean in LISP爲什麼在某些情況下需要將#放在Lisp中?

我學習口齒不清,但有一點我不明白的是爲什麼是必要的#」使用。如果存在具有特定名稱的函數,爲什麼lisp會認爲它是一個變量? 例如:

>(remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10)) 
(2 4 6 8 10) 
+2

這已被回答之前:http://stackoverflow.com/questions/4873810/what-does-mean-in-lisp – 2012-03-07 06:25:35

+0

我很抱歉。我應該刪除我的列表嗎? – Andy 2012-03-07 06:36:42

回答

4

一些lisp,像Common Lisp,需要這樣做。其他人,如Scheme,則不。

您需要這樣做,因爲您正在使用的Lisp具有用於函數的單獨命名空間與「正常」變量。如果您遺漏了#',那麼符號evenp將被解釋爲指的是「正常」(非功能)名稱空間。

+0

感謝您的快速響應。我不知道lisp是這樣分開的,至少在lisp中是這樣。非常感激。 – Andy 2012-03-07 04:03:02

3

讀語法

#'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(至少在某些重要情況下)可以進行優化。

+0

感謝您的回覆。這個例子來自我正在使用的書,所以我不會在我的代碼中使用它,但我很欣賞這些建議。 – Andy 2012-03-07 04:05:16