这是什么意思?
它只是意味着所有这三个都具有相同的效果:
(let ((x nil)) (let ((x)) (let (x)
x) x) x)
在每种情况下,x都绑定到nil。大多数人都熟悉第一种情况。第二种情况不包括init-form,但 Common Lisp 也被定义为在这种情况下将x绑定到nil。当然,第二种情况,从某种角度来看,有更多你需要的括号(它只是变量周围的一组额外括号),所以你甚至可以采取另一种捷径,只写变量本身。
它在哪里指定?
在let的文档中,我们看到let的语法是:
让 ({var | (var [init-form])}*) 声明* 形式* ⇒ 结果*
从那里,我们看到let的每次使用都会看起来像
(let (…) …)
但是那个内部列表是什么?
{变量 | (var [init-form])}*
* 表示该列表中可以有任意数量(零个或多个)事物,并且每个事物都匹配var或(var [init-form])。var 只是一个可以用作变量的符号。( var [init-form])是一个列表,它以var作为第一个元素,并且可选地具有第二个元素init-form。
但这意味着在两种可能的情况下(var本身和没有 init-form 的列表)没有init-form。Common Lisp 没有定义未绑定或未初始化的变量,而是将这些情况下的值定义为nil。
为什么允许如此多的变化?其中很多是为了在 Common Lisp 中不同的特殊形式之间保持一致。看看问题 VARIABLE-LIST-ASYMMETRY Writeup。有关阅读文档中的语法规范的更多信息,请查看1.4.4.20 字典条目的“语法”部分。