Imagine que tengo los siguientes archivos en mi paquete (ridículo):
Archivo test1.el
:
;;; test1.el ---
;;; Code:
(defvar test-var1)
(defun test-fun1 (test)
nil)
(require 'test2 "./test2.el)
(provide 'test1)
;;; test1.el ends here
Archivo test2.el
:
;;; test2.el ---
;;; Code:
(defun test-fun2 ()
(let ((test test-var1))
(test-fun1 test)))
(provide 'test2)
;;; test2.el ends here
Si entonces corro:
emacs -batch -f batch-byte-compile *.el
Obtengo el siguiente resultado:
Compiling .../test1.el...
Wrote .../test1.elc
Compiling .../test2.el...
In test-fun2:
test2.el:9:15:Warning: reference to free variable `test-var1'
In end of data:
test2.el:14:1:Warning: the function `test-fun1' is not known to be defined.
Wrote .../test2.elc
Entiendo por qué aparecen estas advertencias, y entiendo que son solo advertencias. Sin embargo, sería fácil omitir un error tipográfico en el nombre de una función al descartar todas las advertencias de este tipo.
De alguna manera pensé que agregar una (require 'test2)
línea test2.el
debería solucionarlo. Sin embargo, en este caso obtengo:
Compiling .../test1.el...
In toplevel form:
test1.el:10:1:Error: Recursive `require' for feature `test2'
Compiling .../test2.el...
In toplevel form:
test2.el:5:1:Error: Recursive `require' for feature `test1'
Esto es críptico, porque pensé que el objetivo require
era precisamente evitar la carga recursiva. Supongo que require
se comporta como load
durante el tiempo de compilación.
¿Cuál es una buena (y segura) forma de deshacerse de estas advertencias?
El manual ofrece una solución alternativa (lo publico como una respuesta mejor que nada a continuación), pero en última instancia, me gustaría que la solución sea bastante automática (no requiriendo que enumere todas las funciones y variables que necesitaré en cada archivo).
La solución ideal sería incorporada en emacs o provista con Cask. Si no existe, tomaré lo que está disponible, por supuesto.
fuente
-mode
función). El ejemplo es un ejemplo de juguete, si se usatest-fun2
no cambiaría el problema en absoluto.test-variables
), y este archivo no tendrá que requerir ninguna de las otras.eval-when-compile
's, y los paquetes deberán establecer su variable alnil
final del archivo (porque todos los archivos están compilados en Una sola sesión). También tiene la ventaja de mostrarme por qué es exactamente más complicado evitar la carga recursiva que la carga repetida.Tu ejemplo es raro:
require
prueba2 al final de la prueba1, mientrasrequire
que "siempre" debe estar al comienzo de un archivo.require
es innecesariamente), y OTOH su test2 llama a funciones test1, por lo que necesita test1, pero norequire
lo hace.IOW, tienes tu
require
s al revés.fuente
test1
por supuesto, usaría las funciones definidas portest2
, y el paquete solo se cargaríatest1
(a través de carga automática). ¿No debería ser esta respuesta un comentario en su lugar? Simplemente estoy señalando que mi ejemplo está bastante mal elegido y no proporciona una respuesta a la pregunta.El manual sugiere sumar
declare-function
ydefvar
líneas.El
test2
archivo resultante es:Sin embargo, esto debe hacerse para todas las funciones y todas las variables definidas en los archivos "primarios".
fuente