XEmacs and APEL

Shuhei KOBAYASHI shuhei @ aqua.ocn.ne.jp
2002年 7月 24日 (水) 22:17:06 JST


Shuhei KOBAYASHI <shuhei @ aqua.ocn.ne.jp> writes:
> 何となく山岡さんの問題意識がわかってきたような...

私の場合, *-maybe の仕組みを最初から理解していたし defsubst の濫用が
以前から XEmacs 方面から批判されていたことも知っていたので, 山岡さん
とは逆に compile-time evaluation の方を軽視しがちだったみたいですね.

[apel-ja:00701] を書いた時にも自覚したし, 3 年前に pym.el を分離した時

| ;;; pym.el --- Macros for Your Poe.

と書いたように, 私は *-maybe は APEL のためのものであるという意識が
強いみたいです. ところが世の中では

> > "Use `*-maybe' only when you exactly know what you are doing!"
> > ↑こう思われていないことが問題なのね.
> さよう、いつでも使える便利なマクロ。:-p

と期待されているみたいですね. 実際, FreeBSD ports を適当に入れた
site-lisp の中で grep を実行してみましたが, 色々出てきますねぇ...

  bitmap/x-face-mule.el:  (defun byte-compile-file-form-defun-maybe (form)

深く追ってはいませんが, byte-compile-file-form-defun-maybe とは...
何か禁断の技に手を出しているのですか?

  skk/skk-macs.el:(put 'ignore-errors 'defmacro-maybe t)

なぜ 'defmacro-maybe を put しているのか, これの意図が読み切れないです.
(eval-when-compile (require 'cl)) が行なわれ, このファイル自身も compile
時に既に load されているという場合になら効果はあると思うのですが...
やはり, compile 時の test を誤魔化すためのものでしょうか?

他の使用例を見ても単に

| defun-maybe is a Lisp macro in `pym'.
| (defun-maybe NAME &rest EVERYTHING-ELSE)
| 
| Define NAME as a function if NAME is not defined.

という動作を期待して使用しているものが多いみたいですね.
docstring をこのままにしてあった責任を取って, ここはひとつ, 実際の動作を
docstring に合わせてしまいましょうか;-)

(defvar def*-maybe-enable-compile-time-hack nil
  "If non-nil, `def*-maybe' macros will do compile-time check.
`def*-maybe' macro normally checks existence of its target function or
variable at load-time.  But if this variable is non-nil at compile-time,
existence of its target is first checked at compile-time, and if exists,
it will emit no compiled code at all!
You should set this variable to non-nil only when you really know what
you are doing.")

(defmacro defun-maybe (name &rest everything-else)
  "Define NAME as a function if NAME is not defined.
See also the function `defun'."
  (if (or (null def*-maybe-enable-compile-time-hack)
          (not (fboundp name))
          (get name 'defun-maybe))
      (` (or (fboundp (quote (, name)))
	     (prog1
		 (defun (, name) (,@ everything-else))
	       ;; This `defun' will be compiled to `fset',
	       ;; which does not update `load-history'.
	       ;; We must update `current-load-list' explicitly.
	       (setq current-load-list
		     (cons (quote (, name)) current-load-list))
	       (put (quote (, name)) 'defun-maybe t))))))

def*-maybe-enable-compile-time-hack を APEL の installer の中でだけ non-
nil に設定すれば APEL の中では今まで通り, XEmacs Packages では APEL の
installer を使わないはずなので問題なし, APEL 以外で使われている *-maybe
は期待通り(?)に load 時のみ test を行なうことになりますがどうでしょうか?

-- 
Shuhei KOBAYASHI
"Use compile-time evaluation only when you exactly know what you are doing!"
ということなのね.




More information about the APEL-ja mailing list