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