たとえば、あるリストの要素をループで回して処理したいことがよくある。それこそ頻繁に。
今まで、そんなときは while 一本やりで通してきた*1。たとえばこんな感じ。
(let ((lst '(11 22 33 44 55)))
(while lst
(dbg-msgbox (car lst))
(setq lst (cdr lst))))
要素1つを取り出すのに car したり、ループの末尾で cdr を リストにセットし直したり、めんどいなぁとは思っていた。
dolist はこういうときにうってつけ。下記のように書ける。
(let ((lst '(11 22 33 44 55)))
(dolist (e lst)
(dbg-msgbox e)))
すっきりした気分だ。
実は dolist は Emacs を使ってたときから存在だけは知っていた。しかし書き方が複雑そうで敬遠していたのだった。でも使ってみたらすごくシンプルで、while で回すよりも数段 LISPっぽい。場面はぜんぜん違うが、On Lispの
そうしないとLispに逆らってプログラムを書くことになるからだ.
http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/functionalProgramming.html
の一文を思い出した。
LISPっぽいといえば、上の例は mapcar で一発だったりする。
(mapcar #'(lambda (x) (dbg-msgbox x)) '(11 22 33 44 55))
本当は、
(mapcar #'dbg-msgbox '(11 22 33 44 55)) ;; not work
と書きたいけど、ダメっぽい。よくわからん。マクロは関数じゃないから mapcar には渡せないのかな。
まだまだ精進が足らんようだ。
0 コメント :
コメントを投稿