common-lisp 作为惯例列出
示例
一些语言包括列表数据结构。通用Lisp和Lisp家族中的其他语言广泛使用列表(Lisp的名称基于LIStProcessor的思想)。但是,CommonLisp实际上并不包括原始列表数据类型。相反,列表按惯例存在。该约定取决于两个原则:
符号nil是空列表。
非空列表是一个cons单元,其车是列表的第一个元素,它的CDR是列表的其余部分。
仅此而已。如果您已阅读名为什么是缺点单元的示例?,那么您知道一个cons单元格的汽车为X,其cdr为Y可以写为(X。Y)。这意味着我们可以根据上述原则编写一些列表。元素1、2和3的列表很简单:
(1 . (2 . (3 . nil)))
但是,由于列表在Lisp语言家族中非常普遍,因此,对于cons单元,除了简单的点对标记外,还有一些特殊的打印约定。
符号nil也可以写为()。
当一个cons单元格的cdr是另一列表(()或cons单元格)时,不是使用点对符号来写一个cons单元格,而是使用“列表符号”。
列表符号通过几个示例最清楚地显示:
(x . (y . z)) === (x y . z) (x . NIL) === (x) (1 . (2 . NIL)) === (1 2) (1 . ()) === (1)
这个想法是在括号内以连续的顺序写入列表的元素,直到到达列表中的最终cdr。如果最终的cdr为nil(空列表),则写入最终的括号。如果最终的cdr不为nil(在这种情况下,该列表称为不正确的列表),则将写入一个点,然后再写入该最终的cdr。