方案:如何产生'(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))
你会发现这是写同一个值的两种方式。
我尝试了各种 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))
你会发现这是写同一个值的两种方式。