Common-Lisp:绑定形式参数,究竟是什么传递?

时间:2016-05-14 08:46:56

标签: common-lisp symbols

假设我们有一个符号,带有符号值,一个函数值和一个属性列表,我们称之为q。还假设我们有一个带有形式参数f的函数v,例如(f (v) ... )并将此功能称为(f q)

我的问题是:究竟是什么传递给了v?是

  1. q;
  2. 的值
  3. q;
  4. 的功能值
  5. q的属性列表,
  6. 传递给形式参数v

    如果它们全部传递给v,那么我很困惑的事实是我们确实需要函数funcallapply。如果v确实同时具有值​​和函数值,那么它肯定会自己决定在我们编写(v 3)时,它必须使用v的函数值而不是{{ 1}}。当我们使用(funcall v 3)时,它必须使用(setq v 3)的值。

    究竟是什么传递给了v,为什么v不是一个符号,而只是一个“参数”或“变量”,对我来说是一个谜。但我相信它在Lisp 1.5中真的是一个象征。但在共同的Lisp中,似乎有一些 房间混乱。

3 个答案:

答案 0 :(得分:6)

如果你有

(f q)

表示使用值f 调用函数q

  1. Lisp看到f是一个函数,因此整个(f q)是一个函数形式。
  2. Lisp评估q的值。
  3. Lisp使用一个值调用f
  4. Lisp将局部变量v绑定到传递的值
  5. Lisp执行函数f的主体 ...
  6. v在源代码中是一个符号,但它表示一个变量。在编译的代码中,符号消失了。由于Common Lisp使用词法绑定,因此变量现在是词汇引用。

答案 1 :(得分:2)

由于您引用了它,因此您传递符号q而不是其任何值;可以使用f(symbol-value v)在<{1}}内访问这些值。

您需要(symbol-function v)的原因是因为Common Lisp使用符号的函数值,当它出现在列表的头部进行评估时。所以,如果你写

funcall

它将调用符号(v 3) 的函数值。但是传递给v的值是f的值,而不是函数值。但是当你写作

v

(funcall v 3) 位于参数列表中,因此会对其进行评估以获取其值。该值是符号v,当您尝试调用符号时,q会查找其函数值,因此在这种情况下它等同于

funcall

答案 2 :(得分:0)

传递变量q的值。

(f q)已评估的表单,在这种情况下,名称q被解释为变量。

如果要访问函数q中名称f的函数值或属性列表,则需要引用名称并说出'q。通过这样做,您指的是函数值和属性列表值的全局注册表,而不是函数f内传递的本地信息

变量q的值在函数f内传递。