运行SICP Scheme文件,如快速失败的测试

l0b*_*0b0 9 shell ubuntu scheme sicp

经过几年的编程,似乎终于攻击SICP了.但是,我不是在Emacs中编辑和运行所有内容,而是使用不同的编辑器和简单的makefile来运行所有练习.这似乎并不完全是正典的,因为我找不到任何像运行文件那样基本的东西,直到"失败".那么我如何在shell上运行Scheme,以便它加载一个文件,按顺序计算每个表达式,并在遇到一个评估为#f或者退出代码为零的语句时终止为非零退出代码.整个文件评估成功?到目前为止最接近解决方案的事情:

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

1 ]=>
Run Code Online (Sandbox Code Playgroud)

编辑:换句话说,如果其中任何一个表达式评估到ch1.s​​cm加载期间是否有某种方法使评估停止#f

mic*_*kig 5

如果你不想求助于一个完整的单元测试库(可以理解),一个选择就是自己编写.您可以使用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)))))))))
Run Code Online (Sandbox Code Playgroud)

如果将上面的内容放在一个被调用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))'
Run Code Online (Sandbox Code Playgroud)

(注意上面有一些麻省理工学院计划特定的事情,与eval环境有关)