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.
-mode
función). El ejemplo es un ejemplo de juguete, si se usatest-fun2
no cambiaría el problema en absoluto.