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 .elcarchivo! Encontré que cl-eval-whentienen una semántica adecuada (según el nombre)
Normalmente no necesitamos requirecomo archivo de sitio ypackage.el
Por ejemplo, quiero compilar en bytes mi .emacsque 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-compilenombre y hago algo que no se espera de su nombre?
elisp
coding-conventions
gavenkoa
fuente
fuente

w3m-DEPENDENT-CODEde 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.emacsarchivo 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,requiresolo 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-compilese supone que debe hacer?C-h f eval-when-compilele 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-compilenombre ayúdame a entender punto a nombreeval-when-compile, gracias!Para evaluar el código solo en la etapa de compilación, use
eval-whenmacros fechadas por RMS en 1993-07-30.cl-eval-whenapareció 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
.emacsarchivo. Si desarrolla una biblioteca, debe hacerrequireo dividir el archivo de la biblioteca en separado y cargar solo las características requeridas.fuente
(defvar auto-revert-interval)defvarsolució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.