Запускайте файлы SICP Scheme, такие как быстро провальные тесты - PullRequest
9 голосов
/ 08 августа 2011

После нескольких лет программирования, кажется, пришло время наконец атаковать SICP . Однако вместо того, чтобы редактировать и запускать все в Emacs, я бы предпочел использовать другой редактор и простой make-файл для запуска всех упражнений. Похоже, это не совсем канон, потому что я не смог найти ссылки на что-то столь же простое, как запуск файла, пока что-то не «сработало». Итак, как мне запустить Scheme на оболочке , чтобы он загружал файл, оценивал каждое выражение в последовательности и заканчивал ненулевым кодом выхода, как только он встречает оператор, который оценивается как #f или с кодом завершения, равным нулю, если весь файл был успешно оценен? Ближайшее решение до сих пор:

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

1 ]=>

Редактировать: Другими словами, есть ли какой-нибудь способ остановить вычисление во время загрузки ch1.scm, если любое из выражений в нем оценивается как #f?

Ответы [ 2 ]

5 голосов
/ 09 августа 2011

Один из вариантов, если вы не хотите прибегать к полноценной библиотеке модульного тестирования (понятно), - написать свою собственную. Вы можете использовать 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, вы можете вызвать это с помощью MIT Scheme из командной строки Unix следующим образом:

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

(обратите внимание, что выше приведены некоторые специфические для Схемы MIT вещи, относящиеся к eval и окружающей среде)

0 голосов
/ 09 августа 2011

Я могу придумать два пути.Грубым способом было бы написать сценарий expect, который запускает схему как подчиненный процесс и передает ей строку за раз и проверяет возвращаемый результат - в основном, будучи роботом.Более элегантный способ - заменить REPL верхнего уровня в интерпретаторе схемы на тот, который завершается, если выражение оценивается как #f.

...