2011-08-08 17 views
9

Birkaç yıllık programlamanın ardından SICP numaralı saldırıya son verme vakti geldi. Ancak, Emacs'te her şeyi düzenlemek ve çalıştırmak yerine, tüm egzersizleri çalıştırmak için farklı bir editör ve basit bir makefile kullanmayı tercih ederim. Bu tamamen kanon gibi görünmüyor, çünkü bir dosyaya "başarısız" olana kadar bir dosyayı çalıştıran bir şey olarak herhangi bir referans bulamadım. Kabuğun kapsayıcısını nasıl çalıştırmalıyım? bir dosyayı yükler, her bir ifadeyi sırayla değerlendirir ve #f veya bir çıkış koduyla değerlendiren bir ifade ile karşılaşır geçmez sıfır olmayan bir çıkış koduyla sonlandırır tüm dosya başarıyla değerlendirildi mi? bugüne kadar çözüme yakın şey:Hızlı başarısız testler gibi SICP Scheme dosyalarını çalıştırın

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

1 ]=> 

Düzenleme: Başka bir deyişle, ifadelerin herhangi oradaki #f için değerlendirmek durumunda ch1.scm yüklenmesi sırasında değerlendirme stop yapmak için bir yol var mı?

+1

Eğer RackUnit gibi bir birim test kütüphanesinden (http://docs.racket-lang.org arayan muyuz (bazı MİT Şeması belirli eval ilgili yukarıdaki şeyler ve çok mekanın var dikkat edin) /rackunit/index.html)? –

+0

Bu bir son çare olurdu, çünkü Python ve Bash gibi dillerde aşırı olacaktı. – l0b0

+1

Temel olarak, bash'da ne yapmaya çalışıyorsunuz, doğrudan Şema'da yapılabilir, bana yaklaşımı overkill gibi görünüyor :) –

cevap

0

İki yol düşünebilirim. Brute-force yolu, bir inferior süreç olarak şemayı çalıştıran bir expect komut dosyası yazmak ve her seferinde bir satır besler ve geri dönen çıkışı kontrol eder - temel olarak bir robot olur. Şema yorumlayıcınızdaki üst düzey REPL'yi, ifade #f olarak değerlendirirse çıkacak olanla değiştirmek daha zarif bir yol olacaktır.

5

Tam donanımlı bir birim test kitaplığına başvurmak istemiyorsanız bir seçenek (anlaşılabilir) kendiniz yazmaktır. Dosyadan s-ifadelerini okumak için read'u kullanabilir, bunları değerlendirmek ve false olup olmadığını sınamak için eval kullanın ve bir yanlış bulduğunuzda geri göndermeyi deneyin. Böyle bir şey çalışması gerekir: Eğer unit.scm adlı bir dosya ve test etmek istediğiniz dosyaya yukarıdaki koyarsanız test.scm denir

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

, bunu gibi Unix komut satırından MİT Planı ile bu çağırabilirsiniz:

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