Allgemeine Redewendung zur Umgehung der Makroerweiterung oder zum Auflösen von Warnungen vor undefinierten Variablen während der Bytekompilierung:
(eval-when-compile
(require 'cl-lib))
Aber require ...
das in .elc
Datei kompiliert ! Ich fand, dass cl-eval-when
die richtige Semantik (nach Namen) haben.
Normalerweise brauchen wir nicht require
als Site-Datei undpackage.el
Zum Beispiel möchte ich meine Bytes kompilieren, .emacs
die einige externe Makros verwenden, aber stillschweigend durchlaufen, wenn es kein solches Paket gibt:
(cl-eval-when 'compile
(condition-case err
(require 'w3m-util)
(error (byte-compile-warn "Failed by: %S" err))))
(w3m-util-DEPENDENT-CODE ...)
Ein anderer Weg, dies zu tun, ist:
(ignore-error
(require 'w3m-util)
(w3m-util-DEPENDENT-CODE ...))
Aber jetzt sind wir keine Top-Level-Form ...
Fülle ich diesen eval-when-compile
Namen richtig aus und mache etwas, was von seinem Namen nicht erwartet wird?
elisp
coding-conventions
Gavenkoa
quelle
quelle
w3m-DEPENDENT-CODE
einem Vermisstenw3m-util
.(when (require 'w3m-util nil t) (w3m-util-DEPENDENT-CODE...))
(when (require 'w3m-util nil t) ...)
ist eine nette Redewendung! Aber ich versuche, eine perfekte.emacs
Datei zu erstellen, keine Bibliothek. Denken Sie also daran, das Laden von Code (auf Anfrage) mithilfe des automatischen Ladens zu verzögern. Aus diesem Grund verwende ich häufig dieeval-after-load
Frage, obrequire
die Byte-Kompilierung nur mit der Makro-Erweiterung erfolgreich sein soll.Antworten:
Hast du Emacs gefragt, was
eval-when-compile
er tun soll?C-h f eval-when-compile
sagt Ihnen, dass es das Argument auch beim Laden auswertet:Es heißt, wenn es interpretiert wird, ist es wie
progn
. Und es wiederholt dies ausdrücklich.Ein Funktions- oder Makroname spiegelt das Verhalten selten perfekt wider. In diesem Fall klingt es jedoch so, als würden Sie nach einem anderen Verhalten suchen, das als "Verhalten" bezeichnet werden könnte
eval-only-when-compile
.quelle
eval-only-when-compile
Name hilf mir zu verstehen, Punkt zu Nameeval-when-compile
, danke!Um Code nur in der Kompilierungsphase auszuwerten, verwenden Sie
eval-when
Makros, die von RMS am 30.07.1993 datiert wurden.cl-eval-when
erschien am 03.06.2012 von Stefan Monnier und ist für Emacs 22.x nicht verfügbar (wenn es dich interessiert, tue ich das).Zum Beispiel möchten Sie in loswerden
Warning: assignment to free variable
:Fügen Sie einfach über dieser Zeile hinzu:
Beachten Sie, dass dies nur für die Byte-Kompilierung von
.emacs
Dateien nützlich ist . Wenn Sie eine Bibliothek entwickeln, sollten Sierequire
die Bibliotheksdatei in separate und nur die erforderlichen Funktionen laden.quelle
(defvar auto-revert-interval)
defvar
in vielen Fällen eine Lösung, suche aber auch nach einer stärkeren Lösung. Ich kann den Namen falsch eingeben oder das Paket kann die Definition entfernen und die Kompilierungsprüfung ist in solchen Fällen stumm.