Idioma común para solucionar la expansión de macros o resolver advertencias sobre variables indefinidas durante la compilación de bytes:
(eval-when-compile
(require 'cl-lib))
Pero esto require ...
compilado en .elc
archivo! Encontré que cl-eval-when
tienen una semántica adecuada (según el nombre)
Normalmente no necesitamos require
como archivo de sitio ypackage.el
Por ejemplo, quiero compilar en bytes mi .emacs
que usa algunas macros externas, pero pasar silenciosamente si no hay tal paquete:
(cl-eval-when 'compile
(condition-case err
(require 'w3m-util)
(error (byte-compile-warn "Failed by: %S" err))))
(w3m-util-DEPENDENT-CODE ...)
Otra forma de hacer esto es:
(ignore-error
(require 'w3m-util)
(w3m-util-DEPENDENT-CODE ...))
Pero ahora no somos una forma de nivel superior ...
¿Relleno correctamente ese eval-when-compile
nombre y hago algo que no se espera de su nombre?
elisp
coding-conventions
gavenkoa
fuente
fuente
w3m-DEPENDENT-CODE
de los desaparecidosw3m-util
.(when (require 'w3m-util nil t) (w3m-util-DEPENDENT-CODE...))
(when (require 'w3m-util nil t) ...)
es un buen idioma! Pero trato de hacer un.emacs
archivo perfecto , no una biblioteca. Por lo tanto, tenga en cuenta la carga de código retrasado (a pedido) con la ayuda de la carga automática. Por esta razón, uso muchoeval-after-load
,require
solo se necesita para que la compilación de bytes tenga éxito con la expansión de macros.Respuestas:
¿Le preguntaste a Emacs qué
eval-when-compile
se supone que debe hacer?C-h f eval-when-compile
le dice que evalúa el argumento también en el momento de la carga:Dice que si se interpreta es como
progn
. Y explícitamente repite esto.Un nombre de función o macro rara vez refleja el comportamiento perfectamente. Pero en este caso, parece que está buscando un comportamiento diferente, que podría llamarse
eval-only-when-compile
.fuente
eval-only-when-compile
nombre ayúdame a entender punto a nombreeval-when-compile
, gracias!Para evaluar el código solo en la etapa de compilación, use
eval-when
macros fechadas por RMS en 1993-07-30.cl-eval-when
apareció en 2012-06-03 de Stefan Monnier y no está disponible para Emacs 22.x (si te importa, lo hago).Por ejemplo, te gusta deshacerte de
Warning: assignment to free variable
:solo agregue sobre esa línea:
Tenga en cuenta que esto es útil solo para la compilación de bytes del
.emacs
archivo. Si desarrolla una biblioteca, debe hacerrequire
o dividir el archivo de la biblioteca en separado y cargar solo las características requeridas.fuente
(defvar auto-revert-interval)
defvar
solución en muchos casos, pero también busco una solución más fuerte . Puedo escribir mal el nombre o el paquete puede eliminar la definición y el comprobador de compilación sería silencioso en tales casos.