如果我试试这个
(apply (first '(numberp)) '(17))
一切顺利,返回T
。但是这个
(apply numberp '(17))
获取The variable NUMBERP is unbound.
但是这个
(apply #'numberp '(17))
的工作原理。我在这里显然遗漏了一些非常基本的东西。 。 。
答案 0 :(得分:4)
您在这里缺少的是Common Lisp reading和evaluation如何运作。
当您提供CL文本时,例如
(apply (first '(numberp)) '(17))
读者(您可以自己invoke!)将其解析为以下列表:
(apply (first (quote (numberp))) (quote (17)))
(请注意,'
只是quote
)的语法糖,然后进行评估:
apply
first
numberp
first
应用于该列表,获取numberp
quote
下的东西,即长度为1的元素17
的列表apply
)应用于参数,即将numberp
的(函数绑定)应用于一个元素的列表 - 17. 你的第二个表格与第一个表格的不同之处在于你有一个符号numberp
,它被评估为一个变量,因此你得到错误。
在您的第3个表单中,您使用#'numberp
,读者会将其转换为(function numberp)
,这会返回函数值,该值可应用于列表。
简而言之,这是Common Lisp为Lisp-2的结果。
您可能还会发现When to use 'quote in Lisp具有指导性。
答案 1 :(得分:1)
(apply numberp '(17))
做的是查找变量 numberp的值。这与apply
无关。函数位置中的未加引号的符号(列表中的第一个元素)在函数名称空间中查找,后续元素在变量名称空间中查找。
如果你尝试(+ x 1)
,你会得到同样的错误。或(symbol-function symbol-function)
就此而言。
要使(apply numberp '(17))
起作用,您需要将变量numberp绑定到函数。例如:
(let ((numberp 'numberp))
(apply numberp '(17)))