使用 r6rs 必须使用 display 来输出内容吗?
背景:我是计划的新手,正在使用 DrScheme 来编写我的程序。
当我将程序作为 r5rs 运行时,以下程序输出 12345:
12345
但是,以下程序不输出任何内容(它是一个 r6rs 程序):
#!r6rs
(import (rnrs))
12345
也就是说,我可以通过这样做来使其输出 12345:
#!r6rs
(import (rnrs))
(display 1235)
这是 r6rs 的新功能吗,其中输出仅当使用 display
特别指定时才会发生?或者我只是做错了什么
Background: I am new to scheme, and am using DrScheme to write my programs.
The following program outputs 12345 when I run the program as r5rs:
12345
However the following program outputs nothing (it's an r6rs program):
#!r6rs
(import (rnrs))
12345
That being said, I can get it to output 12345 by doing this:
#!r6rs
(import (rnrs))
(display 1235)
Is that something new with r6rs, where output only occurs when specifically specified using display
? Or am I just doing something else wrong
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是您在这里看到的一个微妙的问题。在 PLT 中,首选的操作模式是在模块中编写代码,其中每个模块都有编写它的语言的规范。通常,默认语言是
#lang schema
(#!
是#lang
的缩写)。在这种语言中,行为是让所有顶级非定义表达式显示它们的值(除非它们是空的——就像大多数副作用的结果一样)。但是#lang r5rs
和#lang r6rs
不会执行相同的操作 - 因此这些顶级表达式会被计算但不会显示。您确实看到 R5RS 语言的一些输出的原因是您没有将其用作“模块”(如
#lang r5rs
),而是使用了特定的R5RS“语言级别”。这种语言级别与 R5RS 更兼容,但由于各种微妙的原因,这通常不是一个好主意。因此,使用#lang
通常会更好,如果您想避免一些额外的麻烦,那么现在坚持使用#lang schema
会更容易,并且稍后再担心标准。 (当然,YMMV。)This is a subtle issue that you're seeing here. In PLT, the preferred mode of operation is to write code in a module, where each module has a specification of the language it is written it. Usually, the default language is
#lang scheme
(and#!
is short for#lang
). In this language, the behavior is for all toplevel non-definition expressions to display their values (unless they're void -- as in the result of most side-effects). But the#lang r5rs
and#lang r6rs
don't do the same -- so these toplevel expressions are evaluated but never displayed.The reason you did see some output with the R5RS language is that you didn't use it as a "module" (as in
#lang r5rs
), but instead used the specific R5RS "language level". This language level is more compatible to the R5RS, but for various subtle reasons this is not a good idea in general. Using#lang
is therefore generally better, and if you want to save yourself some additional redundant headaches, it'll be easier if you stick with#lang scheme
for now, and worry about standards later. (But YMMV, of course.)