(ばかげた)パッケージに次のファイルがあるとします。
ファイルtest1.el
:
;;; test1.el ---
;;; Code:
(defvar test-var1)
(defun test-fun1 (test)
nil)
(require 'test2 "./test2.el)
(provide 'test1)
;;; test1.el ends here
ファイルtest2.el
:
;;; test2.el ---
;;; Code:
(defun test-fun2 ()
(let ((test test-var1))
(test-fun1 test)))
(provide 'test2)
;;; test2.el ends here
それなら私は走ります:
emacs -batch -f batch-byte-compile *.el
次の結果が得られます。
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
私はこれらの警告が表示される理由を理解し、それらは単なる警告であることを理解しています。ただし、この種の警告をすべて無視することで、関数名のタイプミスを見逃しやすくなります。
(require 'test2)
行を追加test2.el
することで修正できると思いました。ただし、この場合は次のようになります。
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'
これは不可解です。というのは、require
再帰的なロードを回避することが目的であると私は思ったからです。私はそれrequire
がload
コンパイル時のように動作していると思います。
これらの警告を取り除くための良い(そして安全な)方法は何ですか?
マニュアルは回避策を提供しますが(私はそれを以下より良い回答として投稿します)、最終的には、解決策をかなり自動化したいと思います(必要なすべての関数と変数をリストする必要はありません)すべてのファイル)。
理想的なソリューションは、emacsに組み込まれるか、Caskで提供されます。それが存在しない場合は、もちろん利用可能なものを利用します。
-mode
関数)。この例はおもちゃの例であり、それを使用しtest-fun2
ても問題はまったく変わりません。