[mew-dist 22279] Re: accelerating by-folder

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
2002年 11月 14日 (木) 13:43:21 JST


From: Kazu Yamamoto (山本和彦) <kazu at example.com> さん曰く
Subject: [mew-dist 22278] Re: accelerating by-folder
Message-ID: <20021114.131754.63233477.kazu at example.com>
Date: Thu, 14 Nov 2002 13:17:54 +0900 (JST)

> かなりトリッキーですが、以下のような方法ではどうでしょうか? mapcar は
> 組み込み関数ですが、うまく break しているようです。
> 
> (let ((alist (mew-local-folder-alist))
>       (case-fold-search nil)
>       found)
>   (catch 'break
>     (mapcar (lambda (x)
> 	      (cond
> 	       ((and (stringp (cdr x)) (string-match "[A-Z]" (cdr x)))
> 		(throw 'break (setq found (cdr x))))
> 	       ((and (stringp (car x)) (string-match "[A-Z]" (car x)))
> 		(throw 'break (setq found (car x))))))
> 	    alist))
>   found)

以前聞いた話だと、扱う list の長さが 10ぐらいまでは mapcar の方
が速いけど、それ以上なら while の方が速い、らしいとのことです。
また、mapcar はそれ自身の戻り値を作っていますが、今回の場合はそ
れも無駄に作っていることになるので、こういう場合は、

  (catch 'break
    (while (setq x (car alist))
      (cond
       ((and (stringp (cdr x)) (string-match "[A-Z]" (cdr x)))
	(throw 'break (setq found (cdr x))))
       ((and (stringp (car x)) (string-match "[A-Z]" (car x)))
	(throw 'break (setq found (car x)))))
      (setq alist (cdr alist))))

で十二分じゃないかと。

-- 
白井秀行 (mailto:shirai at example.com)



Mew-dist メーリングリストの案内