【问题标题】:Scheme: how to produce '(5 . (5))方案:如何产生'(5 . (5))
【发布时间】:2015-11-30 05:25:52
【问题描述】:

我尝试了各种 cons 和 append 组合来产生 '(5 . (5)) 但我做不到。有什么办法吗?

【问题讨论】:

  • 你能展示你最好的尝试吗?所以我们可以指出错误以及如何纠正它。
  • 我想不出一种方法来让 Racket 准确地输出 - 如果一对中的 cdr 是一个正确的列表,它就不会打印为点对。问如何创建特定的结构比如何获得特定的输出格式更好。
  • 你能告诉我们为什么你需要这样表示的列表吗?什么程序正在消耗这个结果,为什么它需要这样?
  • 看这个问题:Dot notation in scheme。您想要的结构只是(list 5 5)(cons 5 (cons 5 '())),或'(5 5)'(5 . (5))等。但标准打印将始终为(5 5)
  • 是的,我明白了。是打印机的问题,不是内部结构的问题。

标签: append scheme racket cons


【解决方案1】:

冒着听起来像比尔克林顿的风险,这取决于您所说的“生产”。

如果您的意思是“生成一个在屏幕上打印为'(5 . (5)) 的值,那么您有点不走运,因为该值打印为'(5 5)

对于类似的示例:我如何生成数字 1e-1 ?好吧,试着输入它;这与 0.1 相同,如果您输入 1e-1,它将打印为 0.1。

但是,您可以评估

#lang racket
(= 0.1 1e-1)

...你会发现它们是同一个数字。

以同样的方式,尝试评估

#lang racket
(equal? '(5 . (5)) (list 5 5))

你会发现这是写相同值的两种方式。

【讨论】:

    【解决方案2】:

    没有可移植的方法来不正确地打印正确的列表。最简单的方法是编写自己的打印机。一个非常简单的方法如下:

    (define (write-dot obj . maybe-port)
      (define out (if (null? maybe-port) (current-output-port) (car maybe-port)))
      (cond ((pair? obj) 
             (display "(" out)
             (write-dot (car obj) out)
             (let loop ((obj (cdr obj)))
               (display " " out)
               (cond ((null? obj))
                     ((and (pair? obj) (null? (cdr obj)))
                      (display ". " out)
                      (write obj out))
                     ((pair? obj) (write-dot (car obj)) (loop (cdr obj)))
                     (else (write obj)))
               (display ")" out)))
            (else (write obj out))))
    

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 2015-04-27
      • 2016-04-28
      • 1970-01-01
      • 2013-10-02
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多