Lisp-Paket Unterschiede zwischen repl und Kompilierung-Datei
-
01-10-2019 - |
Frage
Ich bin derzeit mit lispbuilder-sdl auf SBCL unter Windows zu spielen.
Meine Quellcode ist wie folgt:
(asdf:operate 'asdf:load-op :lispbuilder-sdl)
(asdf:operate 'asdf:load-op :lispbuilder-sdl-binaries)
(asdf:operate 'asdf:load-op :lispbuilder-sdl-examples)
(sdl-examples:squashed)
Wenn ich die Datei, die ich den Fehler kompilieren. Paket „SDL-Beispiele“ nicht gefunden
Wenn ich die (sdl-Beispiele: zerquetschte) entfernen aus der Datei kompiliert es ok. Ich kann dann geben (sdl-Beispiele: zerquetschte). An dem ers und das Demo-Spiel beginnt fein
Warum ist das sdl-Beispiele Paket aus dem ers gefunden, aber nicht, wenn ich die Datei kompilieren?
Lösung
Alle von der Zusammenstellung dieser Datei geschehen, bevor eine der load-op
s ausführen. Also, wenn Lisp die (sdl-examples:squashed)
Linie kompiliert, es ist nicht die load-op
ausführen, die Ihr Paket definiert.
Sie können dies umgehen, indem sie nicht das sdl-examples
Paket zu erwähnen, dass der Leser benötigt sein squashed
Symbol zu finden, bevor die load-op
tatsächlich ausgeführt wird:
(funcall (symbol-function (intern (symbol-name '#:squashed)
(find-package (symbol-name '#:sdl-examples)))))
Die Idee ist, das Paket von seinem symbolischen Namen zu berechnen, Lookup das Symbol Ihrer Funktion zu benennen, und holen die Funktion es Namen - aber auf diese Weise erfordert, dass das Paket gibt es nur, wenn der Code ausgeführt wird, nicht, wenn es zuerst gelesen wird . Dann können Sie Ihre vier Aussagen alle zusammengestellt, um, ausgeführt werden, und durch die Zeit, die letzte Anweisung ausgeführt wird, Sie load-op
s das Paket erstellt hat.
Also hier ist ein wenig mehr Informationen über das, was passiert hier:
-
'#:some-name
Schreiben bezieht sich auf ein Symbol, das nicht Teil eines Pakets ist. So So können wir einen Verweis auf einen symbolischen Namen, ohne entweder machen (1) unter der Annahme der Verpackung vorhanden ist oder (2) Ausmisten ein anderes Paket mit dem Namen. - Dann extrahiert
'(symbol-name #:some-name)
den Namen des Symbols als String zurück. Warum nicht einfach"some-name"
schreiben? Sie könnten, und es wird in der Regel arbeiten. Aber auf diese Weise ist etwas robuster für den Fall der Durchführung eines „modernen Modus“ case-sensitive Lisp. - Die
find-package
bildet einen String-Namen Lisp die Darstellung eines Pakets. Denken Sie daran, bis Sie diese Zeile ausführen, wird Ihr Paket vorhanden sind. -
intern
gibt das Symbol mit dem angegebenen Namen, dass Leben in dem gegebenen Paket. -
symbol-function
gibt die Funktion Objekt (eine Lambda-Abstraktion, oder was wahrscheinlicher ist, das kompilierte Darstellung) mit dem Symbol verbunden ist. - Und dann
funcall
Invokes Funktion, die. Es ist eine Art klobig, aber leider ist es nicht wirklich eine bessere Möglichkeit, Anrufe zu mischen, das Last-Code ein Paket mit Namen in diesem Paket in der gleichen Datei leben zu erstellen.