2011/04/01

dolistって



たとえば、あるリストの要素をループで回して処理したいことがよくある。それこそ頻繁に。

今まで、そんなときは 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 には渡せないのかな。


まだまだ精進が足らんようだ。




*1:「なんとかの一つ覚え」も10年ほどやっていると、python の i += 1 みたいに「一貫性がある」とか思えてくるから不思議。





Related Posts Plugin for WordPress, Blogger...

0 コメント :

コメントを投稿