【问题标题】:cons two elements outputs the wrong result两个元素输出错误的结果
【发布时间】:2015-04-06 17:59:48
【问题描述】:
#lang racket

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

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

【问题讨论】:

  • 使用(cons 2 (list 1 2 3)) 你不会得到(2 (1 2 3))

标签: racket cons


【解决方案1】:

由于(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))。打印机仅在绝对需要时才尝试使用该点。

【讨论】:

    【解决方案2】:

    解释结构的语法、存储方式和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 . ()))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多