这些是 cons 的不同参数组合的输出。我刚开始学习lisp。有人可以帮我理解这些吗?
Break 80 [81]> (CONS '(A) 'B)
((A) . B)
Break 80 [81]> (CONS '(A) '(B))
((A) B)
Break 80 [81]> (CONS 'A 'B)
(A . B)
Break 80 [81]> (CONS 'A '(B))
(A B)
Break 80 [81]>
cons函数总是做同样的事情:它产生一个包含其参数的cons 单元格。一个 cons 单元只是一对。您可以使用car获取该对的第一个元素,使用cdr获取第二个元素。
要编写文字单元格,您可以引用并使用符号(x . y),其中x是汽车,y是cdr。使用这种表示法,您可以如下编写示例(但不要只相信我的话,在 REPL 中尝试一下):
> '((A) . B ) ;=> ((A) . B)
> '((A) . (B)) ;=> ((A) B)
> '( A . B ) ;=> (A . B)
> '( A . (B)) ;=> (A B)
但是为什么第二个和第四个案例的结果打印出来的方式和我们写的不一样呢?cons 单元格有特殊的打印约定,因为我们使用 cons 单元格来实现链表。
阅读14.1.2 Conses as Lists了解详细信息,但列表是一个 cons 单元,其 car 是列表的第一个元素,其 cdr 是列表的其余部分(即另一个列表)。这意味着列表(1 2 3)与(使用文字点对符号)(1 . (2 . (3 . nil)))相同。您可以在 REPL 中尝试:
> '(1 . (2 . (3 . nil))) ;=> (1 2 3)
对于列表如此基础的语言来说,这是一个非常有用的打印(和输入)约定。我在回答其他问题时也写了更多关于此的内容: