9

数年間のプログラミングの後、ついにSICPを攻撃する時が来たようです。ただし、Emacs ですべてを編集して実行するのではなく、別のエディターと単純なメイクファイルを使用してすべての演習を実行したいと思います。何かが「失敗」するまでファイルを実行するなどの基本的なことへの参照が見つからなかったため、これは完全に正則ではないようです。では、Scheme をシェル上で実行してファイルをロードし、各式を順番に評価#fし、終了コードがゼロに評価されるステートメントに遭遇するとすぐにゼロ以外の終了コードで終了するようにするにはどうすればよいでしょうか。ファイル全体が正常に評価されましたか? これまでの解決策に最も近いもの:

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

1 ]=>

編集: つまり、ch1.s​​cm の式のいずれかが評価された場合、ch1.s​​cm の読み込み中に評価を停止する方法はあり#fますか?

4

2 に答える 2

5

本格的な単体テスト ライブラリ (理解できる) に頼りたくない場合の 1 つのオプションは、独自のライブラリを作成することです。を使用readしてファイルから s 式を読み取り、 を使用evalしてそれらを評価し、それらが false かどうかをテストし、レポートを返し、false を見つけたら終了することができます。このようなものが動作するはずです:

(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 スキームでこれを呼び出すことができます。

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

eval(上におよび環境に関連する MIT スキーム固有のものがあることに注意してください)

于 2011-08-09T03:40:29.943 に答える
0

2つの方法が考えられます。力ずくの方法は、expectscheme を下位プロセスとして実行し、一度に 1 行ずつフィードして、返された出力をチェックするスクリプトを作成することです。基本的には、ロボットです。より洗練された方法は、スキーム インタープリターのトップレベルの REPL を、式が と評価された場合に終了するものに置き換えること#fです。

于 2011-08-09T03:19:22.087 に答える