#lang racket
我需要从一个元素和一个列表创建一对
但是,当我(cons 2 (list 1 2 3))
得到时(2 (1 2 3))
,我想得到(2 . (1 2 3))
如何得到点?
因为(cons a b)
与(a . b)
我们得到(2 . (1 2 3))
的相同,(cons 2 (list 1 2 3)
所以与 相同(list 2 1 2 3)
。确认:
> (cons 2 (list 1 2 3))
'(2 1 2 3)
> '(2 . (1 2 3))
'(2 1 2 3)
请注意,打印机打印(2 1 2 3)
而不是(2 . (1 2 3))
. 打印机仅在绝对需要时才尝试使用该点。
解释结构的语法、存储方式和display
表示方式之间存在差异。
对于两个元素的列表,您可以通过两种方式来表示它(1)
和(1 . ())
. 显示此列表时,它将始终首选括号最少的列表。因此'(2 . (1 2 3))
将始终打印为(2 1 2 3)
by display
。如果你不想这样,你可以让自己cons-write
喜欢:
;; displays cons always as dotted
(define (cons-write x)
(if (pair? x)
(begin
(display "(")
(cons-write (car x))
(display " . ") ; spaces are important
(cons-write (cdr x))
(display ")"))
(write x)))
(cons-write '(1 2 3 4)) ; prints (1 . (2 . (3 . (4 . ()))))