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

  • Lisp认为
    f
    是一个函数,因此整个
    (fq)
    是一个函数形式
  • Lisp将
    q
    计算为其值
  • Lisp使用一个值调用
    f
  • Lisp将局部变量
    v
    绑定到传递的值
  • Lisp执行函数体
    f

  • v
    在源代码中是一个符号,但它表示一个变量。在编译代码中,符号消失了。因为CommonLisp使用词法绑定,所以变量现在是词法引用

    传递变量
    q
    的值

    (f q)
    是一种评估的形式,在这种情况下,名称
    q
    被解释为一个变量

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


    只有变量
    q
    的值被传递到函数
    f

    中,我发现这些信息非常有用。文学作品中有时很令人困惑。我在文献中看到了关于这一切的截然不同的观点和解释。我有时想知道这是否是由于lisp的悠久历史造成的。关于符号和变量的混淆,函数到函数的传递,关于绑定的术语是长期混淆的根源。