【问题标题】:Run SICP Scheme files like fast-failing tests运行 SICP 方案文件,例如快速失败的测试
【发布时间】:2011-10-22 06:58:53
【问题描述】:

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

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

1 ]=>

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

【问题讨论】:

  • 你不是在寻找像 RackUnit (docs.racket-lang.org/rackunit/index.html) 这样的单元测试库吗?
  • 这将是最后的手段,因为在 Python 和 Bash 等语言中,这将是矫枉过正。
  • 基本上你想在 bash 中做什么,可以直接在 Scheme 中完成,对我来说你的方法看起来有点矫枉过正:)
  • 怎么样?重要的一点是我希望能够使用任何编辑器,并且一旦其中一个评估返回 #f,就应该停止执行。
  • 如果你不想碰我理解的文件,否则使用其他语言将Scheme文件解析为表达式是无意义的,将它们提供给scheme然后检查退出代码是否可以只需导入一个库,在 Scheme 中编写检查即可。快速失败正是我链接的那个库所做的,请看第 3.1 节

标签: shell ubuntu scheme sicp


【解决方案1】:

如果您不想求助于成熟的单元测试库(可以理解),一个选择是编写自己的。您可以使用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,您可以使用 MIT Scheme 从 Unix 命令行调用它,如下所示:

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

(请注意上面有一些 MIT 计划特定的东西,与 eval 和环境有关)

【讨论】:

    【解决方案2】:

    我可以想到两种方法。蛮力的方法是编写一个expect 脚本,将scheme 作为一个劣质进程运行并一次输入一行并检查返回的输出——基本上,作为一个机器人。更优雅的方法是将方案解释器中的顶级 REPL 替换为如果表达式计算为 #f 则退出的一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2014-04-17
      • 1970-01-01
      相关资源
      最近更新 更多