[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
asynchronous process (was: inline image for emacs20.x)
;; 井上さんの指摘をきっかけに,w3m-proc.el の実装を見直しています.
>> On Thu, 04 Apr 2002 09:58:01 +0900
>> 「寺」== teranisi@gohome.org (Yuuichi Teranishi) said as follows:
寺> w3m-w3m-retrieve で redirect を扱うときに苦しんだのは、ある条件が
寺> 満たされるまで非同期プロセスを繰り返し実行するというのがいまの
寺> w3m-proc.el の枠組ではできなさそうだということです。
いいえ.
寺> それで w3m-w3m-retrieve はなんとも苦しいことになっているのですが、
寺> これが w3m-process-while () のような構文で書けたらうれしかったかも
寺> しれないです。
寺> ;; そういえば while があれば何でも書けるというのをどっかで見たよう
寺> ;; な…。
同じ理屈で,再帰があれば何でも書けるということが知られてますよね.それ
で,実は w3m-process-do() は,以下のような書き方をすれば再帰できるので,
ある条件を満たすまで継続という事もできます.
(defun foo (url handler)
(lexical-let ((url url)
(buffer (current-buffer)))
(w3m-process-do-with-temp-buffer
(type (w3m-retrieve url nil nil nil nil handler))
(let ((temp-buffer (current-buffer)))
(goto-char (point-min))
(if (prog1 (search-forward "Recursive retrieve index.html" nil t)
(set-buffer buffer))
(foo (w3m-expand-url "index.html" url) handler)
(insert-buffer temp-buffer)
type)))))
(with-current-buffer (get-buffer-create "*TEST*")
(erase-buffer)
(pop-to-buffer (current-buffer))
(w3m-process-with-null-handler
(foo "http://localhost/~tsuchiya/recursive.html" handler)))
この例では,w3m-process-do() の非同期プロセス終了後に呼び出される body
の最後で,もう一度,非同期プロセスを生成する構図になっていることが要点
です.なお,recursive.html は例えば以下のような内容です.
<!doctype html public "-//W3C//DTD HTML 3.2//EN">
<html><body fgcolor="black" bgcolor="#EEEEEE">
Recursive retrieve index.html.
</body></html>
しかし,現行の w3m-process-with-wait-handler() はまだ不十分なので,以
下のような処理を正しく扱うことができません.
(with-current-buffer (get-buffer-create "*TEST*")
(erase-buffer)
(pop-to-buffer (current-buffer))
(w3m-process-with-wait-handler
(foo "http://localhost/~tsuchiya/recursive.html" handler)))
これは,私の考えでは w3m-process-with-wait-handler() のバグです.
;; でも1時間くらい考えたくらいでは,綺麗に解決できないのでした…,しく
;; しく.どなたか,良い案があれば教えてください.
--
土屋 雅稔 ( TSUCHIYA Masatoshi )