2015-10-19 66 views
0

如果我試試這個普通口齒不清:適用需要特殊治療嗎?

(apply (first '(numberp)) '(17)) 

一切都很好,返回T。但是,這

(apply numberp '(17)) 

得到The variable NUMBERP is unbound.

但這

(apply #'numberp '(17)) 

作品。我顯然在這裏錯過了非常基本的東西。 。 。 。

+0

即使假設變量被綁定,請注意**(let((x 10))(first'(x)))**返回符號** x **,但是* *(let((x 10))x)**返回10.因此,您的代碼試圖應用兩種不同的東西。 –

回答

4

這裏缺少的是Common Lisp readingevaluation的工作原理。

當你給CL文本,例如,

(apply (first '(numberp)) '(17)) 

讀者(你可以自己invoke它!)將其解析爲以下列表:

(apply (first (quote (numberp))) (quote (17))) 

(注意:'只是語法糖爲quote),然後如下評估:

  1. 取功能列表的第一個元素的結合,apply
  2. 評估第二列表元素:
    1. 取功能的first
    2. 評估第二列表元素的結合:
      • 因爲它按照原樣獲取長度爲1的元素列表numberp
    3. first應用於t帽子列表,獲取numberp
  3. 評估第三列表元素:
    • ,因爲它是引用,它只是quote下的東西,即長度1與元素17
  4. 列表將第一個函數(apply)應用於參數,即將numberp的(函數綁定)應用於一個元素的列表--17。

你的第二種形式與第一種不同,因爲你有符號numberp,它被評估爲一個變量,因此你得到你的錯誤。

在你的第三個形式使用#'numberp,讀者轉變爲(function numberp)它返回它可以被應用到列表中的功能值。

總之,這是Common Lisp的結果是Lisp-2

您可能還會發現When to use 'quote in Lisp具有啓發性。

1

所做的是查找變量 numberp的值。這與apply無關。函數位置中的未加引號的符號(列表中的第一個元素)在函數名稱空間中查找,連續元素在變量名稱空間中查找。

如果你嘗試(+ x 1)你會得到同樣的錯誤。或者(symbol-function symbol-function)

對於工作,你需要將變量numberp綁定到一個函數。例如:

(let ((numberp 'numberp)) 
    (apply numberp '(17)))