方案:如何产生'(5 . (5))

Scheme: how to produce '(5 . (5))

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

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

(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))))

冒着听起来像比尔克林顿的风险,这取决于你所说的 "produce"。

如果你的意思是“产生一个在屏幕上打印为 '(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))

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