Common lisp CommonLisp:绑定形式参数,到底传递了什么?
假设我们有一个符号,有一个符号值、一个函数值和一个属性列表,让我们称它为Common lisp CommonLisp:绑定形式参数,到底传递了什么?,common-lisp,symbols,Common Lisp,Symbols,假设我们有一个符号,有一个符号值、一个函数值和一个属性列表,让我们称它为q。还假设我们有一个函数f,带有形式参数v,例如(f(v),并调用类似(f q)的函数 我的问题是:到底传递给v的是什么?是 q的值 q的函数值 q的属性列表 传递到形式参数v 如果它们都被传递给v,那么我对我们确实需要函数funcall和apply感到困惑。如果v真的同时具有值和函数值,那么它肯定可以自己决定,当我们编写(v3)时,它必须使用v的函数值,而不是(funcall v3)。当我们使用(setqv3)时,它必须使
q
。还假设我们有一个函数f
,带有形式参数v
,例如(f(v)
,并调用类似(f q)
的函数
我的问题是:到底传递给v
的是什么?是
q
的值李>
q
的函数值李>
q
的属性列表v
如果它们都被传递给v
,那么我对我们确实需要函数funcall
和apply
感到困惑。如果v
真的同时具有值和函数值,那么它肯定可以自己决定,当我们编写(v3)
时,它必须使用v
的函数值,而不是(funcall v3)
。当我们使用(setqv3)
时,它必须使用v
的值
到底传递给v
的是什么,以及为什么v
不是一个符号,而只是一个“参数”或“变量”,对我来说是一个谜。但我相信它在Lisp1.5中确实是一个符号。但在common Lisp中,似乎有一些
混乱的空间 因为您引用了它,所以传递的是符号
q
而不是它的任何值;可以使用(符号值v)
或(符号函数v)
在f
中访问这些值
需要funcall
的原因是,当符号出现在列表的开头时,Common Lisp使用该符号的函数值进行求值。所以如果你写
(v 3)
(funcall v 3)
它将调用符号v
的函数值。但是传递给f
的值是v
的值,而不是函数值。但是当你写作的时候
(v 3)
(funcall v 3)
v
在参数列表中,因此对其求值以获取其值。该值就是符号q
,当您尝试调用符号时,funcall
会查找其函数值,因此在本例中它相当于
(funcall (symbol-function v) 3)
如果你有
(f q)
这意味着调用值为q
的函数f
f
是一个函数,因此整个(fq)
是一个函数形式q
计算为其值f
v
绑定到传递的值f
v
在源代码中是一个符号,但它表示一个变量。在编译代码中,符号消失了。因为CommonLisp使用词法绑定,所以变量现在是词法引用 传递变量q
的值
(f q)
是一种评估的形式,在这种情况下,名称q
被解释为一个变量
如果要在函数f
中访问名称q
的函数值或属性列表,需要引用名称并说出'q
。通过这样做,您引用的是函数值和属性列表值的全局注册表,而不是在函数f
中传递的本地信息
只有变量
q
的值被传递到函数f
中,我发现这些信息非常有用。文学作品中有时很令人困惑。我在文献中看到了关于这一切的截然不同的观点和解释。我有时想知道这是否是由于lisp的悠久历史造成的。关于符号和变量的混淆,函数到函数的传递,关于绑定的术语是长期混淆的根源。