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?
(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 intensivement eval-after-load
, il require
suffit de faire en sorte que la compilation d'octets réussisse avec l'expansion des macros.
w3m-DEPENDENT-CODE
d'un disparuw3m-util
.