2010.10.08
■[elisp] byte-compile エラーの理解が少し進んだ
以下を順に評価していきました。
(byte-compile (defun func1 () (mac1))) ;=> #[nil "\300 \207" [mac1] 1] (byte-compile (defmacro mac1 () (when var1 t))) ;=> (macro . #[nil "^H\205^E^@\301\207" [var1 t] 1]) ;=> Warning: reference to free variable `var1' (byte-compile (defun func1 () (mac1))) ;=> t ;=> Error: Symbol's value as variable is void: var1 (byte-compile (defvar var1 nil)) ;=> nil (byte-compile (defmacro mac1 () (when var1 t))) ;=> (macro . #[nil "^H\205^E^@\301\207" [var1 t] 1]) (byte-compile (defun func1 () (mac1))) ;=>#[nil "\300\207" [nil] 1]
わかったこと
- マクロ内の変数は defvar していても自由変数扱いになる。なぜなら、マクロはコンパイル時に評価されるが、defvar は eval-when-compile で括らないとコンパイル時に評価されないから。
- その warning を無視して「自由変数」を含むマクロを呼びだす関数をバイトコンパイルするとエラーになる。
