Ich bin neu in CL und benutze AllegroCL. Ich versuche herauszufinden, wie ich meinen Quellcode so organisieren kann, dass er die folgenden Anforderungen erfüllt:
Ich habe versucht, ASDF kreativ zu nutzen, um diese Anforderungen zu erfüllen, und ich kann es nicht richtig machen. Wie gehen andere Menschen mit diesem Problem um? Sind diese 2 Anforderungen nicht "Lispy"?
Verwenden Sie ASDF oder verwenden Sie das Allegro CL defsystem Tool.
Ich benutze quicklisp, das einen "quicklisp" -Ordner in deinem Home-Ordner erstellt, in dem ein "local-project" -Ordner gefunden werden kann. Dieser enthält eine TXT-Datei, in die Sie die URIs in die .ASD-Dateien einfügen können.
Wie man dieses Dienstprogramm benutzt:
project.asd (verwaltet die Includes für den reinen Projektcode)
%Vor%project-test.asd (verwaltet die Includes für den Testcode)
%Vor%fügen Sie nun die URIs für diese Dateien in die oben genannte local-projects.txt
Programm parallel zur Projektquelle in & lt; Dateinamen & gt; .lisp Dateien und die Testaufrufe in & lt; filename & gt; -test.lisp-Dateien (die * -test.lisp-Dateien müssen einen test-execute-Aufruf enthalten)
Starten Sie Ihre sbcl oder was auch immer Sie verwenden und verwenden Sie (ql:quickload "project-name")
oder (ql:quickload "project-name-test")
abhängig, wenn Sie nur ein Projekt laden oder testen möchten.
Das einzige, was Sie sonst irgendwo portieren müssen, ist, die local-projects.txt auf den Computer zu schreiben, auf den das Projekt kopiert wird. Danach können sich Ihre Kollegen darauf verlassen, dass sie asdf-Dateien verwenden und sie in jedem anderen Projekt, das sie wollen, schnell laden können. Zum Kopieren des Projektordners können Sie entweder ctr + c / v oder etwas komplizierteres als git verwenden.
Zum Testen habe ich meine eigene kleine Test-Suite programmiert, aber ich wette, es gibt gute da draußen. Weitere Informationen zu quicklisp finden Sie hier und über asdf hier . Vielleicht kann diese Frage Ihnen helfen Wenn Sie nicht weiterkommen, konfigurieren Sie Quicklisp.
Wenn Quicklisp installiert ist, können Sie die integrierte Funktion Quickproject verwenden.
%Vor%Dies erstellt 4 Dateien:
package.lisp definiert Paket-Namespaces:
%Vor%swatchblade.asd definiert das System / Projekt, Quellcodedateien, Abhängigkeiten usw.
%Vor%swatchblade.lisp ist, wo der Quellcode geht.
Sie können das Projekt über Quicklisp Quickload laden:
%Vor%Wenn Sie dann ein anderes Projekt erstellen, das vom swatchblade-System abhängig ist:
%Vor%Betreffend Tests können Sie einen weiteren Namespace in package.lisp für Ihre Tests hinzufügen:
%Vor%Erstellen Sie eine Testdatei, schreiben Sie den Code und fügen Sie die Datei der Systemdefinition hinzu:
%Vor%Laden Sie den swatchblade-tests -Namespace, um die Tests auszuführen.
Beispielprojekt mit Tests hier
Wenn Sie vermeiden möchten, dass Quicklisp alle Abhängigkeiten in das System installiert, müssen Sie die Abhängigkeiten installieren und das System, soweit ich weiß, manuell laden.
Der Autor von Quicklisp, Zach Beane, hat einen ausführlicheren Beitrag auf mit quickproject .
Nach dem Vorschlag von Rainer schlage ich vor, dass Sie die ASDF-Systemdefinition verwenden, um zwei Systeme zu definieren, Ihr Hauptsystem foo und das Nebensystem foo-tests .
Fügen Sie in der Definition des foo -Systems eine Spezifikation hinzu, die in-order-to
die test-op
auf der foo angibt, Sie müssen test-op
ausführen foo-Tests . Dies stellt sicher, dass, wenn Sie (asdf:test-system "foo")
ausführen, das entsprechende Testsystem mit seinen Abhängigkeiten geladen wird und dann ASDF den Test-op ausführt.
Ich finde, dass FiveAM eine geeignete Bibliothek für den Aufbau von Tests ist.
Das obige wird alles geladen, aber jetzt müssen Sie sicherstellen, dass die test-op
on foo-Tests tatsächlich die Tests ausführt! Dazu müssen Sie eine Methode für PERFORM
für TEST-OP
und (eql (find-system "foo-tests"))
hinzufügen. Diese PERFORM
-Methode sollte alle von Ihnen definierten FiveAM-Tests aufrufen und entweder erfolgreich sein oder einen Fehler auslösen, wenn die Tests fehlschlagen.
Ich habe ein FiveAM-Tester Add-On für ASDF gemacht. Ich werde versuchen, es öffentlich zugänglich zu machen.
Der obige Hinweis ist gut, aber Sie werden frustriert sein, wenn Sie versuchen, nicht exportierte Dinge zu testen. Ein einfacher Workaround besteht nicht darin, zwei Pakete zu definieren. Stellen Sie Ihre Tests einfach in das gleiche Paket mit Ihren anderen Quellen. Was ist der Schaden?
Wenn du denkst, dass es Schaden geben wird, dann musst du es so machen:
%Vor% Der wichtige Teil ist :import-from
Ihr Quellpaket statt :use
es.
Dann müssen Sie die Symbole in Ihrem Quellpaket qualifizieren, wenn Sie sie in Ihrem Testpaket verwenden. Angenommen, Sie haben diese Funktion:
%Vor%Ihr Test könnte wie folgt aussehen:
%Vor% Der wichtige Teil ist, dass du (sources::return-true)
statt nur (return-true)
sagst. Das gleiche gilt für Symbole wie 'sym
; Beziehen Sie sich darauf als 'sources::sym
.
Tags und Links common-lisp asdf