常见的口齿不清:申请需要特殊待遇吗?

时间:2015-10-19 16:33:49

标签: common-lisp

如果我试试这个

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

一切顺利,返回T。但是这个

(apply numberp '(17))

获取The variable NUMBERP is unbound.

但是这个

(apply #'numberp '(17))

的工作原理。我在这里显然遗漏了一些非常基本的东西。 。 。

2 个答案:

答案 0 :(得分:4)

您在这里缺少的是Common Lisp readingevaluation如何运作。

当您提供CL文本时,例如

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

读者(您可以自己invoke!)将其解析为以下列表:

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

(请注意,'只是quote)的语法糖,然后进行评估:

  1. 获取列表第一个元素apply
  2. 的函数绑定
  3. 评估第二个列表元素:
    1. 采用first
    2. 的功能绑定
    3. 评估第二个列表元素:
      • 因为它是引用的,所以请按原样获取长度为1的列表,其中包含元素numberp
    4. first应用于该列表,获取numberp
  4. 评估第3个列表元素:
    • 因为它被引用,它只是quote下的东西,即长度为1的元素17的列表
  5. 将第一个函数(apply)应用于参数,即将numberp的(函数绑定)应用于一个元素的列表 - 17.
  6. 你的第二个表格与第一个表格的不同之处在于你有一个符号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)))