Idiome commun pour l'expansion de macro de contournement ou résoudre l'avertissement sur les variables non définies lors de la compilation d'octets:
(eval-when-compile
(require 'cl-lib))
Mais cela require ...
compilé dans un .elc
fichier! J'ai trouvé qui cl-eval-when
ont une sémantique appropriée (selon le nom).
Normalement, nous n'avons pas besoin d'un require
fichier de site etpackage.el
Par exemple, je veux compiler mon octet .emacs
qui utilise des macros externes, mais passer silencieusement s'il n'y a pas un tel paquet:
(cl-eval-when 'compile
(condition-case err
(require 'w3m-util)
(error (byte-compile-warn "Failed by: %S" err))))
(w3m-util-DEPENDENT-CODE ...)
Une autre façon de procéder est:
(ignore-error
(require 'w3m-util)
(w3m-util-DEPENDENT-CODE ...))
Mais maintenant, nous ne sommes pas une forme de haut niveau ...
Dois-je remplir correctement ce eval-when-compile
nom, faire quelque chose qui n'est pas attendu de son nom?
elisp
coding-conventions
gavenkoa
la source
la source
w3m-DEPENDENT-CODE
d'un disparuw3m-util
.(when (require 'w3m-util nil t) (w3m-util-DEPENDENT-CODE...))
(when (require 'w3m-util nil t) ...)
est un bel idiome! Mais j'essaye de faire un.emacs
fichier parfait , pas une bibliothèque. Ayez donc à l'esprit le chargement de code retardé (sur demande) à l'aide du chargement automatique. Pour cette raison que j'utilise intensivementeval-after-load
, ilrequire
suffit de faire en sorte que la compilation d'octets réussisse avec l'expansion des macros.Réponses:
Avez-vous demandé à Emacs ce qu'il
eval-when-compile
est censé faire?C-h f eval-when-compile
vous indique qu'il évalue également l'argument au moment du chargement:Il dit que s'il est interprété, c'est comme
progn
. Et il répète explicitement cela.Un nom de fonction ou de macro reflète rarement parfaitement le comportement. Mais dans ce cas, il semble que vous recherchiez un comportement différent, qui pourrait être appelé
eval-only-when-compile
.la source
eval-only-when-compile
nom m'aide à comprendre point à nomeval-when-compile
, merci!Pour évaluer le code uniquement à l'étape de la compilation, utilisez des
eval-when
macros datées par RMS en 1993-07-30.cl-eval-when
est apparu en 2012-06-03 de Stefan Monnier et il n'est pas disponible pour Emacs 22.x (si vous vous en souciez, je le fais).Par exemple, vous aimez vous débarrasser de
Warning: assignment to free variable
:ajoutez juste au-dessus de cette ligne:
Notez que cela n'est utile que pour la compilation d'octets de
.emacs
fichier. Si vous développez une bibliothèque, vous devez fairerequire
ou diviser le fichier de bibliothèque en séparer et charger uniquement les fonctionnalités requises.la source
(defvar auto-revert-interval)
defvar
solution dans de nombreux cas, mais je recherche également une solution plus solide . Je peux taper le nom ou le package peut supprimer la définition et le vérificateur de compilation serait silencieux dans de tels cas.