sref in filename.el

Katsumi Yamaoka yamaoka @ jpl.org
2005年 6月 6日 (月) 09:34:38 JST


>>>>> In [apel-ja : No.01284] 村田さん wrote:

> どうやら, filename-special-filter (in filename.el) で sref が使わ
> れている様です.

> CVS 先端の emacs (と Meadow-3.00) では, sref の定義が削除されてし
> まっているので, 対応する必要があると思いますが, 単に aref に置き換
> えてしまって問題ないでしょうか?

Emacs 20.2 以下における非 ascii 文字の扱いは、それ以降のものとは
まったく異なるので、filename.el に古い Emacs もサポートさせるな
らば aref で置き換えることはできません。以下は Mule 2.3 @ 19.34 の
場合です。

(let ((index 0)
      x rest)
  (while (setq x (condition-case nil (aref "日本語" index) (error nil)))
    (setq rest (cons (char-to-string x) rest)
	  index (1+ index)))
  (nreverse rest))
 => ("\222" "\306" "\374" "\222" "\313" "\334" "\222" "\270" "\354")

(let ((index 0)
      x rest)
  (while (setq x (condition-case nil (sref "日本語" index) (error nil)))
    (setq rest (cons (char-to-string x) rest)
	  index (1+ index)))
  (nreverse rest))
 => ("日" "\306" "\374" "本" "\313" "\334" "語" "\270" "\354")

一方、最近まで sref が aref への alias だったように、きちんと書
かれた sref を使うコードを、上位の Emacs では aref に置き換えて
しまうことは可能です。

> 逆に, 古い emacs 用に aref を emulate する必要がありますか?

その必要は無いはずです。

(if (fboundp 'sref) (sref ...) (aref ...)) とするのも一つの手で
すが、そうやって byte code の互換性を考慮する必要は無い気がしま
す (そもそも Emacs 20.3 未満と以上で互換性があるのか?)。

(前にも書きましたが) mu-cite の MU-MK でやっているように、上位の
Emacs では byte compile するときに sref を aref で置き換えてしま
うということもできるでしょう。

(cond ((featurep 'xemacs)
       ...)
      ((and (boundp 'emacs-major-version)
	    (or (> emacs-major-version 20)
		(and (eq emacs-major-version 20)
		     (>= emacs-minor-version 3))))
       ;; Compiler macro for replacing `sref' with `aref'.
       (put 'sref 'byte-optimizer
	    (lambda (form)
	      (cons 'aref (cdr form))))))

あるいは、APEL が (defalias 'sref 'aref) を提供するか、ですね。
Emacs 18 用の defalias は poe-18.el で定義されています。





More information about the APEL-ja mailing list