他の言語のループとlispのループ
2007/06/28
前のエントリ id:smeghead:20070627:loop
なんでlispのloop構文が、とっつきにくいと感じてしまうのかを考えながら。。。
for (my $i = 0; $i < 3; $i++) { print "$i\n"; }
perlでもこんな律儀なforはあまり書かないけど、こんな雰囲気で書けると楽だと思ったので、my-forを作ってみました。
#なぜか、ここで禁断のマクロに手を出すことに。初めてのマクロなので、変だったら突っ込みおねがいしますm(_ _)m
(defmacro my-for (init-form test-form inc-form &body body) `(let ,init-form (loop (if (not ,test-form) (return)) ,@body ,inc-form)))
20070630:test-formの展開が冗長だったので修正した。
break も continueもないmy-forを作ってみた。
(my-for ((i 0)) (< i 10) (incf i) (princ i))
実行結果
0123456789
(my-for ((i 0)) (< i 3) (incf i) (my-for ((j 0)) (< j 3) (incf j) (princ i) (princ j) (princ " ")) (terpri))
実行結果
00 01 02 10 11 12 20 21 22
まぁ、普通の言語のforと同じ定義だから書きやすいっていえば書きやすいんですが、一番痛いのは値を返せないことだと思いました。値を返すためには、my-forのインターフェースを変更しなければならないはずです。インターフェースが変わると、書きにくくなる。
まとめ
結局、他のほとんどの言語で慣れている繰り返し構文で考えてしまっているので、2段階でlispのloopとかdoに翻訳が必要になっているような状態のようです。そのため、lispで loopやdoを書くときに居心地の悪さを感じていたようです。逆を返せば慣れの問題ということです。
#少しの間は、マクロは置いといて、マクロ以外を弄る予定。On Lispは読み進めたい。