shell 像快速失败测试一样运行SICP方案文件

2guxujil  于 2023-01-26  发布在  Shell
关注(0)|答案(2)|浏览(101)

经过几年的编程,似乎是时候攻击SICP了。然而,我宁愿使用不同的编辑器和一个简单的makefile来运行所有的练习,而不是在Emacs中编辑和运行所有的东西。这似乎并不完全符合规范。因为我找不到任何像运行一个文件这样基本的东西的引用,直到某个东西“失败”。那么我如何在shell上运行Scheme以便它**加载一个文件,按顺序计算每个表达式,并在遇到计算结果为#f的语句时立即以非零退出代码终止,或者在整个文件计算成功时以零退出代码终止?**到目前为止最接近解决方案的是:

$ cat ch1.scm
...
(= 1 2)
$ scheme --load ch1.scm
...
Loading "ch1.scm"... done

1 ]=>

编辑:换句话说,在ch1.scm加载期间,如果其中的任何表达式求值为#f,是否有某种方法可以使求值停止?

a6b3iqyw

a6b3iqyw1#

如果你不想求助于成熟的单元测试库(可以理解),一个选择是编写你自己的单元测试库,你可以使用read从文件中读取s表达式,使用eval计算它们并测试它们是否为假,然后返回报告,如果发现为假则退出。

(define (read-and-test filename env)
  (call-with-input-file
      filename
    (lambda (in)
      (let loop ((input (read in)))
        (if (eof-object? input)
            (display "done!")
            (begin
              (if (eval input env)
                  (begin
                    (display input)
                    (display " ok")
                    (newline)
                    (loop (read in)))
                  (begin
                    (display "failed on ")
                    (display input)
                    (newline)
                    (exit)))))))))

如果你把上面的代码放在一个名为unit.scm的文件中,而你要测试的文件名为test.scm,你可以在Unix命令行中使用MIT Scheme调用它,如下所示:

mit-scheme --load `pwd`/unit.scm --eval '(read-and-test "/Users/aki/code/scratch/test.scm" (the-environment))'

(note上面有一些MIT计划的具体内容,与eval和环境有关)

1zmg4dgp

1zmg4dgp2#

我可以想到两种方法:强力方法是编写一个expect脚本,将scheme作为一个低级进程运行,一次给它一行并检查返回的输出--基本上,就像一个机器人;更优雅的方法是将scheme解释器中的顶层REPL替换为一个在表达式计算为#f时退出的REPL。

相关问题