经过几年的编程,似乎是时候攻击SICP了。然而,我宁愿使用不同的编辑器和一个简单的makefile来运行所有的练习,而不是在Emacs中编辑和运行所有的东西。这似乎并不完全符合规范。因为我找不到任何像运行一个文件这样基本的东西的引用,直到某个东西“失败”。那么我如何在shell上运行Scheme以便它**加载一个文件,按顺序计算每个表达式,并在遇到计算结果为#f
的语句时立即以非零退出代码终止,或者在整个文件计算成功时以零退出代码终止?**到目前为止最接近解决方案的是:
$ cat ch1.scm
...
(= 1 2)
$ scheme --load ch1.scm
...
Loading "ch1.scm"... done
1 ]=>
编辑:换句话说,在ch1.scm加载期间,如果其中的任何表达式求值为#f
,是否有某种方法可以使求值停止?
2条答案
按热度按时间a6b3iqyw1#
如果你不想求助于成熟的单元测试库(可以理解),一个选择是编写你自己的单元测试库,你可以使用
read
从文件中读取s表达式,使用eval
计算它们并测试它们是否为假,然后返回报告,如果发现为假则退出。如果你把上面的代码放在一个名为
unit.scm
的文件中,而你要测试的文件名为test.scm
,你可以在Unix命令行中使用MIT Scheme调用它,如下所示:(note上面有一些MIT计划的具体内容,与
eval
和环境有关)1zmg4dgp2#
我可以想到两种方法:强力方法是编写一个
expect
脚本,将scheme作为一个低级进程运行,一次给它一行并检查返回的输出--基本上,就像一个机器人;更优雅的方法是将scheme解释器中的顶层REPL替换为一个在表达式计算为#f
时退出的REPL。