Why `defvar-maybe' is necessary?
Shuhei KOBAYASHI
shuhei @ aqua.ocn.ne.jp
2000年 12月 20日 (水) 22:53:18 JST
>>>>> In <86y9xbpdph.fsf @ aqua.ocn.ne.jp>,
>>>>> Shuhei KOBAYASHI <shuhei @ aqua.ocn.ne.jp> wrote:
> > > ふと疑問に思ったのですが、defvar-maybe って何のために必要な
> > > のでしょうか?
> > > これって defvar と同じ働きしかしないんじゃあ...??
> > すぐに思い付くのは、既存の変数の doc-string を変えないことですが...。
> 変数が既に定義されていた場合に load-history に影響を与えないという違いも
> あると思います. (eval.c の defvar の定義を眺めただけで実際の動作は未確認)
load-history のない v18 では, docstring のない場合に
(defvar-maybe auto-fill-function nil)
などとするのは無駄(単に defvar で良い)ということになりますね.
では,
(defvar-maybe auto-fill-function nil
"Function called (if non-nil) to perform auto-fill.
poe-18.el provides this as dummy for a compatibility.")
ならば良いかと言うと... docstring が有意かどうか疑問ですね.
;; dynamic-docstring が入ったのは 19.29 からなので, それ以前の version
;; では無意味な docstring は memory の無駄になります.
個人的な見解ですが, old compiler の問題もありますので, v18 では本当に
必要でなければ *-maybe は使うべきではないと思っています.
p.s.
poe-18.el の冒頭の Commentary は以下のように変更しようかと思います.
;;; Commentary:
;; Note to APEL developers and APEL programmers:
;;
;; * The old (v18) compiler compiles only outermost forms whose car
;; is `defun' or `defmacro'; any other forms are left uncompiled.
;;
;; * The old compiler recognizes `require's only at outermost level;
;; any other `require's are not evaluated at compile-time.
以下ももっと色々書いておいた方がいいのかも.
;; Therefore,
;;
;; * Definitions with `*-maybe' won't be compiled.
;;
;; * You cannot use macros defined with `defmacro-maybe' within function
;; definitions in the same file.
;; (`defmacro-maybe' is evaluated at load-time, therefore byte-compiler
;; treats such use of macros as (unknown) functions and compiles them
;; into function calls, which will cause errors at run-time.)
;;
;; * `eval-when-compile' and `eval-and-compile' won't be evaluated at
;; compile-time if used at top-level.
例えば,
(or (fboundp 'si:foo)
(progn
(fset 'si:foo (symbol-function 'foo))
(defun foo ...)))
のようにすると, 新たな foo の定義が compile されないので,
(or (fboundp 'si:mark)
(fset 'si:mark (symbol-function 'mark)))
(defun mark (&optional force)
(si:mark))
とした方が良い, など.
p.s.2. 塚本さんへ:
(require
(condition-case nil
(require 'advice)
(error
(error "advice.el is required for this version of SKK.
Install patch/e18/advice.el in load-path and try again."))))
p.s.3.
そういえば, advice.el も
;; `defadvice' expansion needs quite a few advice functions and variables,
;; hence, I need to preload the file before it can be compiled. To avoid
;; interference of bogus compiled files I always preload the source file:
(provide 'advice-preload)
;; During a normal load this is a noop:
(require 'advice-preload "advice.el")
のような楽しい事をしていますね.
--
Shuhei KOBAYASHI
More information about the APEL-ja
mailing list