Hatena::ブログ(Diary)

わからん

2010.10.08

[] 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 を無視して「自由変数」を含むマクロを呼びだす関数をバイトコンパイルするとエラーになる。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

Google