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