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