FLIM 1.14 API (Re: flim-1_13-rfc2231 vs flim-1_14-rfc2231)
Shuhei KOBAYASHI
shuhei @ aqua.ocn.ne.jp
2001年 5月 9日 (水) 19:09:40 JST
>>>>> In <htx1ypznmpy.fsf @ urania.kanji.zinbun.kyoto-u.ac.jp>,
>>>>> tomo @ kanji.zinbun.kyoto-u.ac.jp (守岡 知彦 / MORIOKA Tomohiko) wrote:
> 1つは API 上、inline function/macro を一切使わないということだと思い
> ますが、macro を使わないとできないこととかもあるかも知れないので、そう
> 規定するのは留保したいです。
macro でなければできないこともあるので, inline function とは分けて考え
ましょう. (FLIM API に含まれる macro の必然性については未検討なので...)
> もう一つは、inline function が実際に展開される関数として実現されている
> 場合に、展開された結果利用される関数を規定するということです。
この事は考えてみたのですが, 「展開された結果利用される関数を規定する」と
いうのでは不十分なのですよ. 利用のされ方まで規定しないと意味がないです.
単純な例でいうと
| (defun make-mime-content-type (type subtype &optional parameters)
| (cons (cons 'type type)
| (cons (cons 'subtype subtype)
| parameters)))
と
| (defun make-mime-content-type (type subtype &optional parameters)
| (cons type (cons subtype parameters)))
の二通りの `mime-content-type' に対する `mime-content-type-primary-type'
を inline function として定義すると, それぞれ
| (defsubst mime-content-type-primary-type (content-type)
| "Return primary-type of CONTENT-TYPE."
| (cdr (car content-type)))
と
| (defsubst mime-content-type-primary-type (content-type)
| "Return primary-type of CONTENT-TYPE."
| (car content-type)))
になり, 展開された結果利用される関数を `car' と `cdr' に制限したところで
互換性は得られませんよね?
また, ある実装では互換性に影響しないということで展開した関数が, 別の実装
では展開の結果が内部構造に依存してしまうかもしれません.
そんなわけで, API 上, inline function は一切使わないことにしたいです.
--
Shuhei KOBAYASHI
おまけ:
(defsubst luna-arglist-to-arguments (arglist)
(let (dest)
(while arglist
(let ((arg (car arglist)))
(or (memq arg '(&optional &rest))
(setq dest (cons arg dest))))
(setq arglist (cdr arglist)))
(nreverse dest)))
`luna-arglist-to-arguments' は macro の展開時(byte-compile 時)に使用さ
れる関数で, inline function にする意味は全くないですよね? こんな使い方
を目にすると, inline function なんてやめてしまえと思ってしまいます;-p
ちなみに, `luna-arglist-to-arguments' は
(defun luna-arglist-to-arguments (arglist)
(delq '&optional (delq '&rest (copy-sequence arglist))))
で済みますよね?
More information about the Emacs-mime-ja
mailing list