2011-08-08 8 views
9

プログラミングの数年後、最終的にSICPを攻撃する時が来ました。しかし、Emacsのすべてを編集して実行するのではなく、別のエディタと単純なmakefileを使用して、すべての演習を実行します。何かが "失敗"するまでファイルを実行するのと同じように基本的なものを見つけることができなかったので、これは完全に標準的なものではないようです。だからシェルで Schemeを実行すると、はファイルをロードし、順番に各式を評価し、#fまたは終了コードで評価された文が出たら直ちに非ゼロ終了コードで終了しますファイル全体が正常に評価された場合はゼロを返します。これまでのソリューションに最も近いもの:高速障害テストのようなSICPスキームファイルを実行してください

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

1 ]=> 

編集:他の言葉では、表現のいずれかが、その中#fと評価された場合ch1.s​​cmのロード中に評価を停止させるためにいくつかの方法がありますか?

+1

あなたはRackUnitのようなユニットテストのライブラリを探していません。(http://docs.racket-lang.org /rackunit/index.html)? –

+0

PythonやBashのような言語では過労になる可能性があるので、最後の手段になります。 – l0b0

+1

基本的に何をbashでやろうとしていますか、Schemeで直接行うことができますか、私にはあなたのアプローチは過度のように見えます:) –

答えて

0

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

5

本格的な単体テストライブラリに頼らざるをえない場合(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と呼ばれているファイルに上記を入れた場合、あなたはそのようなUnixコマンドラインからMITのスキームでこれを呼び出すことができます。

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

evalとenviromentsに関連し、上記のいくつかのMITのスキームの特定のものがあります注意してください)

関連する問題