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


#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))将始终按display (2 1 2 3)打印。如果你不想这样,你可以让自己成为这样的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 . ()))))

相关内容

  • 没有找到相关文章

最新更新