[Mew-dist 11123] Re: Symbol's value as variable is void: mew-marker-header-end

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
1999年 10月 29日 (金) 18:05:37 JST


From: Hirakawa Masaya <mhira at example.com> さん曰く
Subject: [Mew-dist 11104] Re: Symbol's value as variable is void: mew-marker-header-end
Message-ID: <19991028185101V.mhira at example.com>
Date: Thu, 28 Oct 1999 18:51:10 +0900

平川> > そうだと思います。mew-cite-color.el から (mew-header-p) とか
平川> > (mew-header-end) とか本体で defmacro されているものを呼んでいる
平川> > ので、一度きれいに Mew 1.94 を立ち上げてから mew-cite-color.el
平川> > を byte-comple すれば大丈夫だと思います。
平川> 
平川> mew-cite-color.el は 1.94 で初めてインストールしたので、古いものを使っ
平川> てるわけではないと思うのですが、新たに mew-1.94.tar.gz を解凍して 
平川> mew-cite-color.el を byte-compile してみたら、うまくいきました。
平川> しかし、1.94 をインストールした時の解凍ディレクトリで byte-compile す
平川> るとうまくいかないのは何故なのでしょう?

mew-cite-color.el に限らず contrib/*.el は mew で定義している関
数やマクロを呼んで使っています。mew に限った話では無いのですが、
defun で定義されているものを呼んでいる elisp は何も問題ないので
すが、defmacro で定義されているものは、byte-compile したときに
*.elc にその defmacro の内容を埋め込んでしまいます。

例えば、mew-cite-color.el で使っている mew-header-p() は
mew-syntax.el で

(defmacro mew-header-p ()
  '(next-single-property-change (point-min) 'read-only))

とマクロで定義されているので、

byte-compile 前 (ようするに *.el の中身)が

	    (if (mew-header-p)

とすると、byte-compile 後 (ようするに *.elc の中身) は

	    (if (next-single-property-change (point-min) 'read-only)

となります。

ここで、mew 1.93 が load された状態(あるいは、load される状態)で
mew-cite-color.el を byte-compile すると、

平川> 1.94 は /usr/local/lib/mule/site-lisp/ にインストールされているのです
平川> が、/usr/local/lib/site-lisp/mew/ の中身が 1.93 のものでした。
平川> この mew ディレクトリで grep をかけたら、該当する variable が存在しま
平川> した。

平川> 今まで *.el にしか grep をかけていなかったのですが、試しに *.elc にも 
平川> grep をかけてみたところ、mew-cite-color.elc で引っ掛かりました。

というように 1.93 の (defmacro mew-header-p () の中身が
mew-cite-color.elc に書き込まれてしまうため、平川さんの様な症状
になったと思われます。

また、byte-compile せず *.el の状態で使っていると、
mew-cite-color.el を load したときに defmacro の中身を探す(?)の
で問題が無いわけです。

# ちなみにこの件に引っかかる方は結構いらっしゃったりします。:-)

-- 
白井秀行 (mailto:shirai at example.com)



Mew-dist メーリングリストの案内