Common Lisp:普通变量是LET中列表的简写?

时间:2014-09-13 23:43:11

标签: common-lisp practical-common-lisp

我正在阅读Gigamonkey's (Peter Seibel's) Practical Common Lisp, 并在the section about DO in the Macros chapter中发现了以下声明:

  

和。一样   LET中的变量定义,如果省略了init-form,则   变量绑定到NIL。与LET一样,您可以使用普通   变量名称作为仅包含名称的列表的简写。

我不知道他的意思是“使用普通变量作为缩写,只包含名称的列表”,即第二句话。第一句话在Common-Lisp Hyperspec for LET中备份,并通过一个简单的示例如(let (n) n) ~~> NIL,但我找不到与第二句相对应的任何内容。事实上,像(let n n)这样的东西会使用一个SBCL编译器。

这是什么意思?这个用法的最小例子是什么?

1 个答案:

答案 0 :(得分:14)

这是什么意思?

这只是意味着所有这三个都具有相同的效果:

(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 (…) …)

但内心清单是什么?

  

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

*表示该列表中可以有任意数量(零个或多个),每个都匹配 var (var [init-form])。 var只是一个可以用作变量的符号。 (var [init-form])是一个列表,其中 var 作为第一个元素,而可选具有第二个元素, INIT-形式

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

为什么允许这么多变化?很多是Common Lisp中不同特殊形式之间的一致性。看看Issue VARIABLE-LIST-ASYMMETRY Writeup。有关阅读文档中语法规范的更多信息,请查看1.4.4.20 The “Syntax” Section of a Dictionary Entry