缺点两个元素输出错误的结果

时间:2015-04-06 17:59:49

标签: racket cons

#lang racket

我需要从元素和列表中创建一对

然而,当我(cons 2 (list 1 2 3)) (2 (1 2 3))时,我得到(2 . (1 2 3)),我想{{1}} 我如何获得点?

2 个答案:

答案 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 . ()))))