yey! : Trip Report: June 2008 ISO C++ Standards Meeting « Sutter’s Mill
しかし、iotaはどういう語源なんだろうと思って調べてみた。何しろ、ノンネイティブな私に乗っては、意味がさっぱり分からない。iota(v.begin(), v.end(), 1)などと書かれていても、さっぱり意味が分からない。
アルゴリズム、iotaはとても簡単である。意味も簡単であれば、実装も簡単。
template < typename Iter, typename Value >
void iota( Iter first, Iter last, Value value)
{
for ( ; first != last ; ++value, ++first )
{
*first = value ;
}
}
であるから、先ほどの例、iota(v.begin(), v.end(), 1)は、1, 2, 3, 4, 5...という値を、順に代入する。この第参引数の関数オブジェクトを変えることによって、どんな型でも、連番を代入することができる。もちろん、連番である必要は無いが、関数の意味から考えると、連番を入れるためのものだ。連番の配列と言うのは、結構必要になったりする。そのたびに自前でループを書くのは、人間のすることではない。STLを食べて呼吸するプログラマならば、当然そういうよくあるアルゴリズムは欲しいはずだ。
しかし、名前がよく分からない。コレは一体いかなる意味を持てるにや。
まず、意味からだ。イオタとは、ギリシャ語で、[Ι]、[ι]、という文字である。これはローマ字では、IやJになっている。英語圏でイオタというと、"not one iota of difference"(イオタほどの差も無い)という慣用句があり、これは「ほとんど違いが無い」という意味である。つまりイオタは、とても小さい差を意味する。インクリメントは最小の差であるので、意味としてのiota関数は正しい。
プログラミングの話になると、たとえばAPLでは、イオタという文字は、連番の整数値の配列を生成する文字である。実は我々C++プログラマも、知らずにイオタを使っているのである。例えば次のfor文だが、
for ( int i = 0 ; i < 100 ; ++i )
{
// 何か百回行われる処理
for ( int j = 0 ; j < 100 ; ++j )
//何か一万回行われる処理
}
参考書などを見ると、大抵は慣習的に、iやjが使われている。この文字の使用は、ことC++にとどまらない。BASICですらIを使ったものだ。何故か。それはiやjが、それぞれ大文字小文字のイオタに相当するからだ。だから使われているのだ。
こうしてみると、意味的にも、プログラミングの慣習的にも、イオタという名称を使うのは正しいということになる。だからもし、iotaを使って、心ない同僚が、「おいおい、その関数名、何やってるか分かりづらいから使うなよな。手でループを書け、手で」などと言おうものなら、こう反論するがいい。「んじゃお前、ループのカウンタとしてiやjも使うなよ。いまから、iやjを使っている参考書の著者全員に抗議してこいよ」と。
Iota - Wikipedia, the free encyclopedia
追記:
でも、ひょっとしたらそんな深い意味はなくて、たんにindexのiかもしれないなぁ。
追記:
変数名の間違いを修正。
変数名iに関しては、Fortranの名残だという説が一般的なようです。
そういえばあれは、変数名によって型が決定される言語でしたっけね。
4 comments:
カウンタの変数名としてiから使うのは古いFortranの仕様に由来する説が有力です。変数名i ~ n は整数として解釈されたため、カウンタとして使うときはiからというのが慣例だったとのこと。FAQなので続きはウェブで。
出遅れた! 私も斉藤さんのおっしゃるとおりFORTAN(!Fortran)が由来だと思います。が、そのFORTRANでi~nが採用された理由は諸説あり、結局数学的に正しいから、というものだったと思いますので、イオタかインデックスのiかは定かではありません。
私の先生に聞きましたところ、FORTRANでは行列に対してはIとJを使っていたが、ふだんは視認性のためにIとKを対に使うことが多かったとのこと。なにしろ、カンマとピリオドを打ち間違えて……という都市伝説があるくらいですからね。
あれ?
Predは述語(boolを返す関数(オブジェクト))だから、この場合は意味が通らないんじゃないかと。
おかしいなと思いながら書いていたのですが、
どうも、引数名を見るとき、上下にあるアルゴリズムと混同したようです。
Post a Comment