如果我試試這個普通口齒不清:適用需要特殊治療嗎?
(apply (first '(numberp)) '(17))
一切都很好,返回T
。但是,這
(apply numberp '(17))
得到The variable NUMBERP is unbound.
但這
(apply #'numberp '(17))
作品。我顯然在這裏錯過了非常基本的東西。 。 。 。
如果我試試這個普通口齒不清:適用需要特殊治療嗎?
(apply (first '(numberp)) '(17))
一切都很好,返回T
。但是,這
(apply numberp '(17))
得到The variable NUMBERP is unbound.
但這
(apply #'numberp '(17))
作品。我顯然在這裏錯過了非常基本的東西。 。 。 。
這裏缺少的是Common Lisp reading和evaluation的工作原理。
當你給CL文本,例如,
(apply (first '(numberp)) '(17))
讀者(你可以自己invoke它!)將其解析爲以下列表:
(apply (first (quote (numberp))) (quote (17)))
(注意:'
只是語法糖爲quote
),然後如下評估:
apply
first
numberp
first
應用於t帽子列表,獲取numberp
quote
下的東西,即長度1與元素17
apply
)應用於參數,即將numberp
的(函數綁定)應用於一個元素的列表--17。你的第二種形式與第一種不同,因爲你有符號numberp
,它被評估爲一個變量,因此你得到你的錯誤。
在你的第三個形式使用#'numberp
,讀者轉變爲(function numberp)
它返回它可以被應用到列表中的功能值。
總之,這是Common Lisp的結果是Lisp-2。
您可能還會發現When to use 'quote in Lisp具有啓發性。
所做的是查找變量 numberp的值。這與apply
無關。函數位置中的未加引號的符號(列表中的第一個元素)在函數名稱空間中查找,連續元素在變量名稱空間中查找。
如果你嘗試(+ x 1)
你會得到同樣的錯誤。或者(symbol-function symbol-function)
。
對於工作,你需要將變量numberp綁定到一個函數。例如:
(let ((numberp 'numberp))
(apply numberp '(17)))
即使假設變量被綁定,請注意**(let((x 10))(first'(x)))**返回符號** x **,但是* *(let((x 10))x)**返回10.因此,您的代碼試圖應用兩種不同的東西。 –