2
#lang racket

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

但是,当我(cons 2 (list 1 2 3))得到时(2 (1 2 3)),我想得到(2 . (1 2 3)) 如何得到点?

4

2 回答 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)). 打印机仅在绝对需要时才尝试使用该点。

于 2015-04-06T18:25:04.130 回答
2

解释结构的语法、存储方式和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 . ()))))
于 2015-04-06T20:02:16.100 回答