2011-08-08 21 views
9

Sau một vài năm lập trình, có vẻ như thời gian để cuối cùng tấn công SICP. Tuy nhiên, thay vì chỉnh sửa và chạy mọi thứ trong Emacs, tôi muốn sử dụng một trình soạn thảo khác và đơn giản là makefile để chạy tất cả các bài tập. Điều này dường như không hoàn toàn chính thức, bởi vì tôi không thể tìm thấy bất kỳ tham chiếu đến một cái gì đó cơ bản như chạy một tập tin cho đến khi một cái gì đó "thất bại". Vì vậy, làm cách nào để chạy Đề án trên vỏ sao cho nó tải một tệp, đánh giá từng biểu thức theo thứ tự và kết thúc bằng mã thoát khác 0 ngay sau khi nó gặp một tuyên bố đánh giá là #f hoặc với mã thoát bằng không nếu toàn bộ tệp được đánh giá thành công? Điều gần gũi nhất với một giải pháp cho đến nay:Chạy các tệp lược đồ SICP như các bài kiểm tra lỗi nhanh

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

1 ]=> 

Edit: Nói cách khác, có một số cách để làm cho dừng thẩm định trong khi tải ch1.scm nếu bất kỳ của các biểu thức trong đó đánh giá để #f?

+1

không phải bạn đang tìm kiếm một thư viện unit-testing như RackUnit (http://docs.racket-lang.org /rackunit/index.html)? –

+0

Nó sẽ là một phương sách cuối cùng, bởi vì trong các ngôn ngữ như Python và Bash nó sẽ là quá mức cần thiết. – l0b0

+1

Về cơ bản những gì bạn đang cố gắng làm trong bash, có thể được thực hiện trực tiếp trong Đề án, với tôi cách tiếp cận của bạn trông giống như overkill :) –

Trả lời

0

Tôi có thể nghĩ ra hai cách. Cách bạo lực sẽ là viết một tập lệnh expect chạy chương trình dưới dạng một quy trình kém hơn và cấp cho nó một dòng tại một thời điểm và kiểm tra đầu ra được trả về - về cơ bản, là rô bốt. Cách thanh lịch hơn sẽ là thay thế REPL cấp cao nhất trong trình thông dịch lược đồ của bạn bằng một trình thông dịch thoát ra nếu biểu thức đánh giá là #f.

5

Một tùy chọn nếu bạn không muốn sử dụng thư viện kiểm tra đơn vị toàn diện (dễ hiểu) là viết thư của riêng bạn. Bạn có thể sử dụng read để đọc biểu thức s từ tệp, sử dụng eval để đánh giá chúng và kiểm tra xem chúng có phải là sai hay không và báo cáo lại, bỏ qua nếu bạn tìm thấy sai. Một cái gì đó như thế này nên làm việc:

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

Nếu bạn đặt ở trên trong một tập tin gọi là unit.scm và các tập tin bạn muốn kiểm tra được gọi là test.scm, bạn có thể gọi đây là với MIT Đề án từ dòng lệnh Unix như vậy:

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

(lưu ý có một số MIT Đề án điều cụ thể trên, liên quan đến eval và các môi trường)

Các vấn đề liên quan