【问题标题】:How to print the folowing to console in scheme r5rs language如何以方案 r5rs 语言将以下内容打印到控制台
【发布时间】:2021-10-15 14:19:18
【问题描述】:
(define x '())
x

在 repl 控制台中给出 => '()

(define x '())
(display x)

给 => () 但我想像 '() 一样打印它

如何让显示打印'()而不是()

我需要这个,因为我的函数正在记录用户提供的错误输入的错误,我只想将'() 输入打印为'(),有点像运行以下命令时方案的方式:

(define x '())
(cdr x)

给 =>

mcdr: contract violation
  expected: mpair?
  given: '() (Note the ')

【问题讨论】:

  • 将空列表打印为'() 是一种敲诈勒索;我不记得曾经见过 Scheme 实现这样做,即使在错误消息中也是如此。这是使用 Racket 的 RnRS 语言之一编写 Scheme 代码的一种方式,与使用专用的 Scheme 实现不太一样。您可以在需要时手动添加单引号。

标签: scheme r5rs


【解决方案1】:

代码:

(define x '())
(define y '(1 . 2))
x ; ==> ()
y ; ==> (1 . 2)

因此,在 Scheme REPL 中评估 x 将显示 (),因为当您评估 '() 时,它会评估没有第一个 ' 的事物。

球拍怪事

在 Racket 中,他们可以配置 REPL 如何在 REPL / 交互式窗口中打印值。在#lang racket 中,当您使用display 时,您会看到真正的价值是什么

(display x) ; prints ()
(display y) ; prints (1 . 2)

但是在$lang r5rs 中,默认设置输出设置的默认REPL 是print

x ; ==> '()
y ; ==> (mcons 1 2)

constructor 作为输出样式:

x ; ==> empty
y ; ==> (cons 1 2)

quasiquote 为输出样式:

x ; ==> `()
y ; ==> `(1 . 2)

以上所有内容并没有真正打印出价值。它以所选样式打印一个表达式,在评估时将变为相同的值。 '()empty `() 都评估为 (),因此所有这些都打印为您在评估 '() 时获得的值

唯一明智的选择是使用write 作为输出样式。这将以与所有其他方案实现相同的方式打印 REPL 中的实际值:

x ; ==> ()
y ; ==> (1 . 2)

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2011-01-22
    • 2011-08-06
    • 2015-03-16
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多