defsubst-maybe-cond & static-cond
Shuhei KOBAYASHI
shuhei @ aqua.ocn.ne.jp
1999年 11月 9日 (火) 12:36:54 JST
ひと月以上前の話ですが...
>>>>> In <14315.62163.69957.8921F @ osaka.email.ne.jp>,
>>>>> Mikio Nakajima <minakaji @ osaka.email.ne.jp> wrote:
> defun-maybe-cond の二番煎じで (defun のところを defusubst に変えただ
> けです) defsubst-maybe-cond に相当するものを作って個人的に利用している
> のですが、
>
> (defsubst-maybe-cond test0 ()
> ((string-match "XEmacs" emacs-version)
> XXX
> )
> (t
> YYY ))
>
> (defsubst test1 ()
> (test0) )
>
> の順に評価しているのに、バイトコンパイルの際に
>
> ** attempt to inline test0 before it was defined
>
> と警告を受けます。しかも YYY の部分に XEmacs の obsolete-function を含
> んでいると XEmacs でバイトコンパイルしているにもかかわらず、例えば、
>
> ** char-octet is an obsolete function; Use split-char
>
> と警告されてしまいます。
>
> 例えば、defsubst-maybe-cond で定義した関数を macroexpand で展開すると
> 次のようになりますが、
>
> (macroexpand
> '(defsubst-maybe-cond test ()
> ((string-match "XEmacs" emacs-version)
> (ignore) )
> (t (ignore)) ))
>
> --->(or (fboundp (quote test))
> (prog1
> (cond ((string-match "XEmacs" emacs-version)
> (defsubst test nil (ignore)))
> (t (defsubst test nil (ignore))))
> (setq current-load-list (cons (quote test) current-load-list))
> (put (quote test) (quote defsubst-maybe) t))
> )
>
> この cond 式のところを static-cond になるようにすれば上記のコンパイラー
> の警告は見事回避でき、とりあえず手元ではちゃんと動いているように、見え
> ているのですが、何か副作用がありますでしょうか?
ここは load 時に既に定義が存在しているかどうかを確認している部分なので,
compile 時の判定に変更する事はできません.
もし, 関数が新たに定義するものであれば, 通常の defsubst を用いて, 関数
定義の内側で static-cond で判断すればうまくいくと思います.
;; byte-compiler は通常の defun/defmacro/defsubst 等が toplevel にある
;; 場合を特別扱いしているため, 可能ならばそちらを使う方が良いです.
;; find-function/find-variable も同様. (正規表現を書けば済むんだけど)
あるいは test0 と test1 を別 file に分けることができれば, それでも回避
できると思います. (test0 の定義が load 時にちゃんと評価される)
--
Shuhei KOBAYASHI
More information about the APEL-ja
mailing list