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

Re: automatically filling out WordPress comment fields



>>>>> In [emacs-w3m : No.10906] 青田さん wrote:
[...]
>> `w3m-form-auto-fill-data' の値
>>
>> (("host1" tree...) ("host2" tree...) ...))
>>
>> の tree の部分が、ホストに関わらず、すべて最後にアクセスしたホス
>> トの値になってしまっているように見えます。

> なるほど…たしかにそうなっていました。 どうも w3m-form-input の部分がおか
> しいようです。ぼくのところでもリストがループしたりしていました。

> `() を (list ...)  のように書き直してみたところ、今のところうまく動いてい
> るようです。

> ;; でも、実質変わりないはず…ですよねぇ?

何が起きているのか興味があったので調べてみました。;-)
あの現象は bytecomp すると起きるみたいです。

くだんのソースコードは byte-code になる前に、次のように展開され
るのですが、

;; 前回のもの
(byte-optimize-form '(setq tree `(,host () ())))
 => (setq tree (cons host (quote (nil nil))))

;; 今回のもの
(byte-optimize-form '(setq tree (list host nil nil)))
 => (setq tree (list host nil nil))

曲者は (quote (nil nil)) で、これが loop の中にあると、最初に
Emacs 内部で生成された object が、次回からは使い回しされてしまう
んですね。一方今回のものは、毎回作られるので問題無い、と。

(defun testfn ()
  (let ((n 3)
	x rest)
    (while (> n 0)
      (setq x `(,n () ()))
      (setcar (cdr x) (* n 10))
      (setcar (cddr x) (* n 100))
      (push x rest)
      (setq n (1- n)))
    rest))
 => testfn

(testfn)
 => ((1 10 100) (2 20 200) (3 30 300))

(byte-compile 'testfn)
 => #[nil ...]

(testfn)
 => ((1 10 100) (2 10 100) (3 10 100))

;; 本来の機能を試すのは後で。^^;;
-- 
山岡