#lang racket
我需要从元素和列表中创建一对
然而,当我(cons 2 (list 1 2 3))
(2 (1 2 3))
时,我得到(2 . (1 2 3))
,我想{{1}}
我如何获得点?
答案 0 :(得分: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))
。只有在绝对需要时,打印机才会尝试使用点。
答案 1 :(得分:2)
解释结构的语法,存储方式以及display
代表它的方式之间存在差异。
对于两个元素的列表,有两种方法可以表示它(1)
和(1 . ())
。显示此列表时,它将始终优先使用括号最少的列表。因此,'(2 . (1 2 3))
始终会(2 1 2 3)
打印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 . ()))))