为什么使用 list 或 cons 构建时相同的数据打印不同?

Why the same data is printed differently when built with list or cons?

我试图通过使用 listcons 的不同组合来重现相同的数据布局。在 MIT Scheme 中,相同的数据布局似乎根据其构建方式的不同而打印不同。

例如,

> (cons 1 (cons 2 3))
(1 2 . 3)
> (list 1 (cons 2 3))
(1 (2 . 3))
> (cons 1 (list 2 3))
(1 2 3)
> (list 1 (list 2 3))
(1 (2 3))

基础数据应始终相同。为什么 MIT Scheme 以不同的方式表示它? pairs的底层排列真的每次都一样吗?

每个输入都构建不同的输出,因此它们的打印方式不同。请注意,以下表达式是等效的:

(cons 1 (cons 2 3))
; (1 2 . 3)

(list 1 (cons 2 3))
(cons 1 (cons (cons 2 3) '()))
; (1 (2 . 3))

(cons 1 (list 2 3))
(cons 1 (cons 2 (cons 3 '())))
; (1 2 3)

(list 1 (list 2 3))
(cons 1 (cons (cons 2 (cons 3 '())) '()))
; (1 (2 3))

记住:当且仅当每个 conscdr 部分也是一个 cons 单元格或空列表时,列表才被定义。