Island Life

< ピアノレッスン99回目 | コミュニケーションと言語 >

2013/07/02

10.times

回数が与えられて単に繰り返すだけ、という操作、小さくないプログラムを 書いてる時は滅多に欲しくならないんだけど、使い捨てプログラムを書いてる時に 欲しくなることはあるんで、前から何か欲しいなとは思ってた。 ただ、この機能のためだけに新たなAPIを入れるほどでもないかなあと。

Common Lispだと(loop repeat 10 do something)と書けるんだけどね。

上のエントリ読んでて、dotimesの構文で変数を省略できるようにしたらどうかと思いついた。

(dotimes (10) (print 'a))

あるいはいっそのこと

(dotimes 10 (print 'a))

でどうだ。

ところで、無限ループを手軽に書きたいと思うこともある。サーバループとか。 いつも(let loop () something ... (loop))と書きながら、 Common Lispだと(loop something ...)でいいのになと思ってた。 これも新たなAPIを入れるほど重要な機能でもない。

上のdotimes構文を使うならこう書けるけど、無限大を明示するのもちょっとおおげさな気はする。

(dotimes +inf.0 something ...)

「上限を省略したら無限」、という慣例に従うなら、例えばこれとかはどうか。

(dotimes () something ...)

あーでもtimesの意味から離れちゃうかなあ。 「何も書いてないものの回数」っていうのはわけわからないか。

結論なしでメモのみ。

(追記2013/07/03 20:53:14 UTC): 実際に書き始めてみたら、(dotimes 10 something)は まずいことに気づいた。この構文は一般化すると(dotimes expr something)に なるけど、exprに式が来たときに通常の(dotimes (var limit) something)と 区別がつかなくなる可能性がある。「exprに変数か即値のみ許す」というような例外は 落とし穴を作るので避けたい。というわけで(dotimes (limit) something)が 落としどころかなあ。

Tag: Gauche

Past comment(s)

po (2013/07/03 05:00:19):

srfi-42は候補外でしょうか。

(use srfi-42) (do-ec (: x 10) (print 'a))

useの手間は残りますね。

shiro (2013/07/03 06:27:44):

今の話は (dotimes (i 10) (print 'a)) のiでさえも余分だから何とかしたいって話なのです。srfi-42でもxが必要ですね。

po (2013/07/03 07:03:50):

あぁ、失礼しました。 元記事の該当部分を読み飛ばしていました。

qualifierをさら拡張するってのは無理筋ですかね。 さっきの例でいうと (do-ec (:repeat 10) (print 'a) みたいな。もっと進めて (do-ec 10 (print 'a)) とか。

shiro (2013/07/03 20:25:17):

それはありかも。私の中ではCLのloop≒srfi-42なので。(do-ec 10 ...)はちょっと逸脱しすぎかと思うけど (dotimesと違ってdo-ecの部分も可変なので、なるべくsyntaxは規則的にしておきたい)。

Post a comment

Name: