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?

War es hilfreich?

Lösung

Alle von der Zusammenstellung dieser Datei geschehen, bevor eine der load-ops 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-ops 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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top