0-based index or 1-based index

Wolfgang Helbigという人が投げかけた質問から始まった、Smalltalkの配列の添え字が0から始まるべきか1から始まるべきかという議論。Dijkstraの83年のメモhttp://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF(手書きだ)の引用では、0ベースにして半開区間[0, size)にするのが一番論理的だ、ということにあっているが最近の言語でも1から始まるものも少なからずある。(Luaも例に挙がってたが、Luaにはhttp://lua-users.org/wiki/CountingFromOneというまた熱い議論がある。)

Smalltalkの普通の配列オブジェクトは1ベースなのだが、StreamとFormは0ベースのように見える。Ianによれば、Formが0ベースなのは「失敗」で、Streamは「直前に読まれた要素へのインデックスなのだ」という意見だったが、どうかねえ。少なくとも後者は納得しがたい。

後はかなり正しい意見として、「配列の添え字となりうるオブジェクト」というものがあって、同じ要素を含んだ配列であっても、ちがうオブジェクトを使ってアクセスすることによって違うベースとして使えるべきだ、ということも言っていた。昔からある、正規表現用の文字列は、ただの文字列ではなくて正規表現型の文字列であるべし、というような話に近いだろうか。

実は"bike-shed"な議論とは思いつつもsqueak-devに俺も投稿してしまったのだが、0ベースのほうがコンピュータ的には便利とは思う。「数を数える」のか、「距離を測る」のかによって、1ベースで考えたほうが人間にとってわかりやすいか、0ベースのほうが良いのかが変わってくると思われる。だから単純な答えはないのだろう。

少なくとも、Cのルーチンを呼ぶ時に混乱しやすいから、というような理由は俺は納得しないがな。