他の言語のループとlispのループ

前のエントリ 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は読み進めたい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください