Ich habe ein wenig Probleme zu verstehen, was aus gelesenen Makros beim Kompilieren einer Datei von Lisp-Code in einen Bytecode oder RAW-Assembly (oder eine Fasl-Datei für diese Angelegenheit). Oder vielleicht verstehe ich es, weiß es aber nicht. Ich bin nur wirklich verwirrt.Kompilieren Lisp-Code mit lesen Makros
Wenn Sie ein Lesemakro verwenden, müssen Sie die Quelle nicht verfügbar haben?
Wenn Sie dies tun, müssen Sie den Quellcode ausführen, der die Funktion des gelesenen Makros ausmacht. Wenn nicht, wie können sie dann arbeiten, wenn Sie Dinge wie read-char
tun können?
, das zu tun, wenn Sie das lesen Makro Verwendung zuvor definierten Variablen haben wollen, müssen Sie alle der Code, bevor es zu der Ausführung, so wird dies der Laufzeit, die alles vermasselt.
Wenn Sie den Code nicht zuvor ausführen, ist das oben definierte Objekt nicht verfügbar.
Was ist mit Funktionen oder Compiler-Makros, die Lese-Makros definieren? Ich würde annehmen, dass sie überhaupt nicht arbeiten würden, außer Sie require
oder load
eine Datei oder etwas, das nicht kompiliert wird. Aber wenn sie kompiliert würden, könnten sie sie nicht benutzen?
Wenn einige meiner Annahmen richtig sind, bedeutet dies, dass es einen großen Unterschied gibt in "welche Daten für Makros verfügbar sind" und "Welche Makros für Funktionen verfügbar sind" abhängig davon, ob Sie eine ganze Datei kompilieren später ausgeführt werden oder eine Datei Zeile für Zeile interpretieren (also einen Ausdruck nach dem anderen lesen, kompilieren und auswerten).
Kurz gesagt, es scheint so zu sein, eine Zeile zu einem Formular zu kompilieren, wo es ohne weitere Makroverarbeitung oder was auch immer ausgeführt werden kann, müssen Sie die vorherigen Zeilen lesen, kompilieren und ausführen.
Denken Sie daran, wieder, dass diese Fragen gelten Lisp zu kompilieren, es nicht zu interpretieren, wo Sie jede Zeile ausgeführt werden können, wie es kommt.
Sorry für meine Wanderungen, aber ich bin neu lispeln und mehr wissen will, wie es funktioniert.
tatsächlich, SBCL hat Interpretationsmodus, es ist nur standardmäßig deaktiviert: http://www.sbcl.org/manual/Interpreter.html –
Common Lisp Compilierung ist inkrementell, aber die Zusammenstellung von Dateien ist etwas anders definiert. –
@Rainer können Sie erarbeiten? Ich bin damit nicht vertraut –