find-coding-system() in pces-e20.el
守岡 知彦 / MORIOKA Tomohiko
tomo @ kanji.zinbun.kyoto-u.ac.jp
2000年 9月 27日 (水) 18:09:16 JST
>>>>> [apel-ja : No.00408] にて
>>>>> “白井”= Hideyuki SHIRAI (白井秀行)
<shirai @ rdmg.mgcs.mei.co.jp> さま曰く:
白井> 早速本題なのですが、pces-e20.el などにある
白井> (defsubst-maybe find-coding-system (obj)
白井> "Return OBJ if it is a coding-system."
白井> (if (coding-system-p obj)
白井> obj))
白井> について質問があります。
白井> Emacs 20.7 などの built-in function の coding-system-p() は
白井> (coding-system-p nil) => t
白井> と 'nil' を与えたときに 't' が帰ってくるのが仕様の様ですが、例え
白井> ば、(APEL の使用を想定していないパッケージで)XEmacs と Emacs で
白井> 共有の関数を書くために
白井> (if (fboundp 'find-coding-system)
白井> (fset 'hoge-coding-system-p (symbol-function 'find-coding-system))
白井> (fset 'hoge-coding-system-p (symbol-function 'coding-system-p)))
白井> と宣言しておくと、上記の defsubst-maybe で pces-e20.el で定義さ
白井> れている find-coding-system() を使うことになります。そうすると、
白井> (hoge-coding-system-p nil) => nil
白井> となってしまい、本来 nil を想定していないため、以降の処理が破綻
白井> してしまいます。
白井> ちなみに、XEmacs 21.2.53 では
白井> (find-coding-system nil) => #<coding_system binary>
白井> となります。
白井> 『仕様』『バグ』『使い方が悪い』というのが考えられるのですが、ど
白井> のようなものでしょうか?
APEL において、多分、nil の場合の挙動は未定義動作だったんだと思います。
そういう意味では『仕様』だったのかもしれません。
;; 実際、nil が coding-system かどうかというのは微妙なところだと思いま
;; す。coding-system を指定する場所の多くは nil を取りますが、通常の
;; coding-system を指定した場合と挙動が異なることがあります。
これを期に (find-coding-system nil) が binary を返すように変更する(明
確化する)ことには賛成します。つまり、これを『バグ』と見倣す訳です。
う。
ところで、APEL に頼らず自前で check & 切替えをする場合において、
白井> (if (fboundp 'find-coding-system)
白井> (fset 'hoge-coding-system-p (symbol-function 'find-coding-system))
白井> (fset 'hoge-coding-system-p (symbol-function 'coding-system-p)))
はやや慎重さが足りないと思います。多分、
(and (fboundp 'find-coding-system)
(subrp (symbol-function 'find-coding-system)))
とか、あるいは
(and (featurep 'xemacs)
(or (featurep 'file-coding)
(featurep 'mule)))
とかの方が良いかも知れません。そういう訳で、『使い方が悪い』という気も
します。
--
┯━…‥・懐かしい未来の記憶をふと思い出しかけた・‥…━━┯━━━┯━
││ ─ │ ─ / ─ ┼─ ┬ ─ ─┼ ┬┴─
┼┼─┼|〓━─┼ 守岡 知彦 (MORIOKA Tomohiko) <tomo @ m17n.org> ─ ─┬
┻┻━┻━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
More information about the APEL-ja
mailing list