2011-08-08 51 views
9

經過幾年的節目,似乎時間終於出擊SICP。但是,我並不想編輯和運行Emacs中的所有內容,而是使用其他編輯器和簡單的makefile來運行所有練習。這看起來並不完全正典,因爲我找不到任何與運行文件一樣基本的東西,除非某些「失敗」。那麼,如何外殼上運行方案,使其加載一個文件,評估在序列中的每個表情,並儘快與非零退出代碼終止,因爲它遇到了在評估爲#f或退出代碼的聲明零如果整個文件被評估成功?最接近的事到目前爲止的解決方案:運行SICP計劃文件,如快速測試失敗

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

1 ]=> 

編輯:換句話說,是有一些方法ch1.s​​cm負荷期間做出評價停止,如果任何表達式其中評估爲#f

+1

你是不是在尋找像RackUnit(一個單元測試庫http://docs.racket-lang.org /rackunit/index.html)? –

+0

這將是最後的手段,因爲在像Python和Bash這樣的語言中,這將是矯枉過正的。 – l0b0

+1

基本上什麼是你想在bash做,可以直接在方案來完成,給我你的方法看起來像矯枉過正:) –

回答

0

我能想到的兩種方法。蠻力的方法是編寫一個expect腳本,該腳本將運行方案作爲低級進程並一次提供一行,並檢查返回的輸出 - 基本上,它是一個機器人。更優雅的方式是將您的方案解釋器中的頂級REPL替換爲當表達式計算結果爲#f時退出的方法。如果你不希望訴諸一個全面的單元測試庫

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))))))))) 

如果你把上面的一個叫unit.scm文件,你要測試的文件被稱爲test.scm,你可以與麻省理工學院計劃從UNIX命令行像這樣調用這個:

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

(注意有一些MIT計劃具體上面的事,涉及到eval和enviroments)

相關問題