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.eldeberí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 requireera precisamente evitar la carga recursiva. Supongo que requirese comporta como loaddurante 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

-modefunción). El ejemplo es un ejemplo de juguete, si se usatest-fun2no 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 alnilfinal 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:
requireprueba2 al final de la prueba1, mientrasrequireque "siempre" debe estar al comienzo de un archivo.requirees innecesariamente), y OTOH su test2 llama a funciones test1, por lo que necesita test1, pero norequirelo hace.IOW, tienes tu
requires al revés.fuente
test1por 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-functionydefvarlíneas.El
test2archivo resultante es:Sin embargo, esto debe hacerse para todas las funciones y todas las variables definidas en los archivos "primarios".
fuente