假设我们有一个符号,带有符号值,一个函数值和一个属性列表,我们称之为q
。还假设我们有一个带有形式参数f
的函数v
,例如(f (v) ... )
并将此功能称为(f q)
。
我的问题是:究竟是什么传递给了v
?是
q
; q
; q
的属性列表,传递给形式参数v
?
如果它们全部传递给v
,那么我很困惑的事实是我们确实需要函数funcall
和apply
。如果v
确实同时具有值和函数值,那么它肯定会自己决定在我们编写(v 3)
时,它必须使用v
的函数值而不是{{ 1}}。当我们使用(funcall v 3)
时,它必须使用(setq v 3)
的值。
究竟是什么传递给了v
,为什么v
不是一个符号,而只是一个“参数”或“变量”,对我来说是一个谜。但我相信它在Lisp 1.5中真的是一个象征。但在共同的Lisp中,似乎有一些
房间混乱。
答案 0 :(得分:6)
如果你有
(f q)
表示使用值f
调用函数q
。
f
是一个函数,因此整个(f q)
是一个函数形式。q
的值。f
。v
绑定到传递的值f
的主体
... 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
内传递。