Nach ein paar Jahren der Programmierung scheint es Zeit zu sein, SICP endlich anzugreifen. Anstatt jedoch alles in Emacs zu bearbeiten und auszuführen, verwende ich lieber einen anderen Editor und ein einfaches Makefile um alle Übungen zu machen. Dies scheint nicht vollständig canon zu sein, weil ich keinen Verweis auf etwas so Grundlegendes wie das Ausführen einer Datei finden konnte, bis etwas "fehlschlägt". Wie kann ich Scheme auf der Shell ausführen , so dass eine Datei lädt, jeden Ausdruck der Reihe nach bewertet und mit einem Beendigungscode ungleich Null endet, sobald eine Anweisung gefunden wird, die auswertet zu #f
oder mit einem Exit-Code von Null, wenn die gesamte Datei erfolgreich ausgewertet wurde? Der Lösung, die bisher am nächsten kam:
Bearbeiten: Mit anderen Worten, gibt es eine Möglichkeit, die Auswertung während des Ladens von ch1.scm anzuhalten, wenn einer der Ausdrücke darin #f
?
Eine Option, wenn Sie nicht auf eine vollständige Unit-Testing-Bibliothek (verständlich) zurückgreifen möchten, ist Ihre eigene zu schreiben. Sie können read
verwenden, um s-Ausdrücke aus der Datei zu lesen, eval
verwenden, um sie zu bewerten und zu testen, ob sie falsch sind, und zurückmelden, wenn Sie einen false finden. So etwas sollte funktionieren:
Wenn Sie das Obige in eine Datei namens unit.scm
setzen und die zu testende Datei test.scm
heißt, können Sie dies mit MIT Scheme aus der Unix-Befehlszeile wie folgt aufrufen:
(Beachten Sie, dass es oben einige MIT-Scheme-spezifische Dinge gibt, die sich auf eval
und Umgebung beziehen)
Ich kann mir zwei Möglichkeiten vorstellen. Der Brute-Force-Weg wäre, ein Skript expect
zu schreiben, das ein Schema als minderwertigen Prozess ausführt und es Zeile für Zeile eingibt und die zurückgegebene Ausgabe überprüft - im Grunde genommen ein Roboter. Der elegantere Weg wäre, die REPL auf der obersten Ebene in Ihrem Schema-Interpreter durch eine zu ersetzen, die beendet wird, wenn der Ausdruck als #f
ausgewertet wird.