这些是 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 cell 就是一对。您可以使用 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 cells 有特殊的打印约定,因为我们使用 cons cells 来实现链表。
阅读14.1.2 Conses as Lists具体来说,列表是一个 cons 单元,其 car 是列表的第一个元素,其 cdr 是列表的其余部分(即另一个列表)。这意味着列表 (1 2 3) 与(使用文字点对符号)(1 . (2 . (3 . nil))) 相同。您可以在 REPL 中尝试:
> '(1 . (2 . (3 . nil))) ;=> (1 2 3)
对于列表如此基础的语言来说,这是一个非常有用的打印(和输入)约定。我也在对其他问题的回答中写了更多关于这个的内容:
我是一名优秀的程序员,十分优秀!