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?
(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 die eval-after-load
Frage, ob require
die Byte-Kompilierung nur mit der Makro-Erweiterung erfolgreich sein soll.
w3m-DEPENDENT-CODE
einem Vermisstenw3m-util
.