我该如何在MIT-Scheme中执行一个.scm脚本(不在REPL中)?

56
我想输入类似于“scheme file.scm”的内容并使其解释该文件,然后将我带回到我的shell,而不是在REPL中加载该文件。
编辑:我尝试了 scheme < test.scm,但它仍然使用REPL,唯一的区别是当流结束时scheme退出。
4个回答

50

scheme < file.scm 应该可以工作(只要您没有指定--interactive,并且标准输入不是终端,Scheme 就可以以非交互方式工作)。


这不符合OP编辑后的要求,即“不使用REPL”。请参见此答案。 - Flux

17

使用MIT Scheme运行Scheme程序:

scheme --quiet < program.scm

--quiet选项确保您程序的输出是唯一显示的内容(即,根据您的要求,您将看不到REPL)。

注意:如果您的程序使用输入过程(如readread-charread-line等)提示用户进行输入,则此选项将不起作用。这是因为shell输入重定向(<)(参见:相关问题)。不幸的是,当使用输入过程时,目前没有正确执行MIT Scheme脚本的方法。最好的选择可能是mit-scheme --quiet --load 'myscript',但当脚本完成时,您必须手动退出MIT Scheme。相关邮件列表线程:[MIT-Scheme-devel] How to run a script and exit?

编辑:由于您可能会将<误输入为>,导致源代码被覆盖,因此我建议将上述命令封装在shell脚本或shell函数中。例如:

runscheme () {
    scheme --quiet < "$1"
}

接下来,您可以毫不担心地运行runscheme program.scm,您的源代码不会被覆盖。(特别感谢Paul Rooney提醒我注意这个潜在的错误)。

参考文献

scheme --help:

--batch-mode, --quiet, --silent

抑制版本和版权的启动报告以及告别语。

这个命令行选项似乎被错误地省略了,在文档命令行选项列表中,但我认为这是一个合法的命令行选项,因为scheme --help显示它,并且因为其他部分的参考手册中使用了--batch-mode(例如此处)。


不要把 < 弄反了,否则你会覆盖自己的源代码,或者只有我这样做吗? - Paul Rooney
如果你经常会犯这样的错误,我建议写一个 shell 脚本或者 shell 函数来运行 Scheme 程序。下面是一个示例 shell 函数:runscheme () { scheme --quiet < "$1" } - Flux
好的,谢谢。我通常不会犯这样的错误。对不起,这并不是对答案的批评。我只是做了一下,当我意识到发生了什么事情时,让我笑了。 - Paul Rooney
@PaulRooney编辑了答案,以便其他人可以避免将来出现这样的错误。感谢您让我注意到这一点。 - Flux
抱歉,我真的不是想让你改变答案。我只是觉得很有趣。我会点赞的,但我已经这样做了。 - Paul Rooney

7

很奇怪,但是如果没有-f选项,它对我来说无法工作。注意一下,伙计们。 - Fyodor
1
这个问题是关于MIT Scheme,而不是SCM。 - Flux

0

我查看了 chez --help,然后发现了这个(假设我正在使用 chez scheme):

chez --script ./temp.scm

此外,--verbose非常有用:
chez --verbose --script ./temp.scm

这个问题是关于MIT Scheme,而不是Chez Scheme。 - Flux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接