Common lisp CommonLisp:plain变量是LET中list的缩写?

Common lisp CommonLisp:plain变量是LET中list的缩写?,common-lisp,practical-common-lisp,Common Lisp,Practical Common Lisp,我在读书, 并在中发现以下声明: 就像 LET中的变量定义,如果省略了init表单,则 变量绑定为NIL。与LET一样,您也可以使用普通 变量名作为仅包含名称的列表的缩写 我不知道他说的“用一个普通变量作为一个只包含名字的列表的缩写”是什么意思,也就是第二句话。第一个句子在中进行了备份,通过一个简单的示例,如(let(n)n)~~>NIL,但是我找不到与第二个句子对应的任何内容。事实上,类似于(让n)的东西占用了SBCL编译器 这是什么意思?这种用法的最小示例是什么?这是什么意思? 这仅仅意味着

我在读书, 并在中发现以下声明:

就像 LET中的变量定义,如果省略了init表单,则 变量绑定为NIL。与LET一样,您也可以使用普通 变量名作为仅包含名称的列表的缩写

我不知道他说的“用一个普通变量作为一个只包含名字的列表的缩写”是什么意思,也就是第二句话。第一个句子在中进行了备份,通过一个简单的示例,如
(let(n)n)~~>NIL
,但是我找不到与第二个句子对应的任何内容。事实上,类似于
(让n)
的东西占用了SBCL编译器

这是什么意思?这种用法的最小示例是什么?

这是什么意思? 这仅仅意味着这三个方面具有相同的效果:

(let ((x nil))      (let ((x))        (let (x)
  x)                  x)                x)
在每种情况下,x都绑定到nil。大多数人都熟悉第一种情况。第二种情况不包括init表单,但在这种情况下,commonlisp被定义为将x绑定到nil。当然,从一个角度来看,第二种情况下,需要更多的括号(它只是变量周围的一组额外的括号),因此您甚至可以选择另一种快捷方式,自己编写变量

具体在哪里? 在的文档中,我们看到let的语法是:

let({var |(var[init form])}*)声明*形式*⇒结果*

从这一点上,我们可以看出,let的每一个用法看起来都像

(let (…) …)
但内心的清单是什么呢

{var|(var[init form])}*

*表示该列表中可以有任意数量(零个或多个)的内容,每个内容要么匹配var,要么匹配(var[init form])。变量只是一个可以用作变量的符号。(var[init form])是一个列表,其中有一个var作为第一个元素,还可以选择第二个元素init form

但这意味着在两种可能的情况下(var本身和没有init形式的列表)没有init形式。Common Lisp没有未绑定或未初始化的变量,而是将这些情况下的值定义为nil

为什么允许这么多的变化?很多都是为了在公共Lisp中实现不同特殊形式之间的一致性。看一看。有关阅读文档中语法规范的更多信息,请参阅