[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: W3m.el and Emacspeak



>>>>> In [emacs-w3m : No.02970]
>>>>>	Katsumi Yamaoka <yamaoka@jpl.org> wrote:

山> つうことで、たぶん後で送ってくれるのではないかと思うのですが、受け
山> 入れて良いですよね(?)。幹と 1_2 枝。

土屋さん> 構わないとは思うのですが,ちょっと釈然としないなあ….

defmacro の defsubst への置き換えの受け入れには、もっと慎重にな
るべきだと思い直しました。例えばこういうもの↓は問題無いのですが、

(defmacro w3m-anchor (&optional position)
  (` (w3m-get-text-property-around 'w3m-href-anchor (, position))))

以下の二例のように compile 時の条件に応じて生成されるコードが異
なる場合は、原則として受け入れないのが後々のためではないか、と。

1. 実行ファイルに if の条件判断を含めずに効率を上げる。
   関数に仕立て直すとほんの少し遅くなります。

(defmacro w3m-anchor-sequence (&optional position)
  (if position
      (` (get-text-property (, position) 'w3m-anchor-sequence))
    (` (get-text-property (point) 'w3m-anchor-sequence))))

2. XEmacs と FSFmacs の違いを吸収。
   これを関数にしてしまうと XEmacs と FSFmacs それぞれが持ってい
   ない関数に対する警告の抑制対策が必要になります。

(defmacro w3m-display-message (string &rest args)
  "Like `message', except that message logging is disabled."
  (if (featurep 'xemacs)
      (if args
	  `(display-message 'no-log (format ,string ,@args))
	`(display-message 'no-log ,string))
    `(let (message-log-max)
       (message ,string ,@args))))

これらはたいしたものではありませんが、ここで関を切ってしまうと、
もっと大きなものも受け入れなければならなくなるかもしれません。
ところで、

以下は失敗作です。

(define-compiler-macro defmacro (name arglist &rest bodies)
  ;; Convert macro form to defsubst form while compiling.
  (let ((docs (when (stringp (car bodies))
		(pop bodies)))
	(args (mapcar
	       (lambda (arg) `(,arg ',arg))
	       (delq '&optional (delq '&rest (copy-sequence arglist))))))
    (if docs
	`(defsubst ,name ,arglist
	   ,docs
	   (,@(eval `(let ,args ,@bodies))))
      `(defsubst ,name ,arglist
	 (,@(eval `(let ,args ,@bodies)))))))

これ↓はうまくいく場合ですが、

(compiler-macroexpand
 '(defmacro w3m-anchor (&optional position)
    (` (w3m-get-text-property-around 'w3m-href-anchor (, position)))))
 => (defsubst w3m-anchor (&optional position)
      (w3m-get-text-property-around 'w3m-href-anchor position))

だめな場合の悲惨さにびっくりしたのが、受け入れを思い直すきっかけ
になりました。:-p
-- 
Katsumi Yamaoka <yamaoka@jpl.org>