一个名称的多个变量或Lisp中一个变量的多个绑定

Le *_*ous 4 lisp variables

我很困惑/不确定如何使用术语变量或绑定.我认为我的不确定性可归结为三个相关的简单问题.

(let ((hi 'outer))
  (let ((hi 'inner))
    (print hi))
  (print hi))
Run Code Online (Sandbox Code Playgroud)

问题A:在上面的代码中,以下哪项是正确的?

  1. 只有一个变量.一个变量有两个绑定:外部绑定和内部绑定.

  2. 一个名称有两个变量:外部变量和内部变量.

当我在互联网上阅读有关局部变量的文章时,有时文章似乎选择1,有时候2.两者是否同样正确?

(let ((hi 0))
  (print hi)
  (setq hi 1)
  (print hi)
  (setq hi 2)
  (print hi))
Run Code Online (Sandbox Code Playgroud)

问题B:以上哪项适合上述代码?

  1. 有一个绑定正在被重用.

  2. 有三个绑定.

我从未见过任何使用单词绑定的材料,选择2作为答案,但另一方面,人们可能仍然认为"名称hi被绑定三次.三个绑定发生.代码执行三个绑定. " 所以我不确定.

(defun fac (n)
  (if (> n 1)
      (* n (fac (1- n)))
    1))
(fac 4)
Run Code Online (Sandbox Code Playgroud)

问题C:正在执行递归函数时,哪个是正确的?

  1. 一个变量会同时绑定几个.

  2. 一个名称将同时存在多个变量.

这似乎与问题A类似,但问题A涉及两个let表单,每个表单只执行一次,而这个问题更像是一个let表单,它同时在多个实例中执行.

这些问题是针脚的角度吗?我想知道这些问题,因为关于在循环中使用闭包的着名问题有很多文章,我认为理解那些文章需要知道一个变量是什么以及一个绑定是什么.

Lar*_*off 9

根据Common Lisp词汇表 :(其他Lisps在术语上可能有所不同)

  • 变量:"变量"命名空间中的绑定.
  • 绑定:名称与名称所表示的名称之间的关联.
  • assign:更改已建立的绑定中的变量值.

所以答案是:

  • 答:两个变量(和两个绑定)
  • B:一次绑定(分配两次)
  • C:一个名称的几个绑定(和几个变量)