自転車置き場の議論

ではさっそく

さて、私はcrowbarDiksamという言語を(解説記事のサンプル言語として)作成してきました。
これらの言語は見かけ上CやJavaによく似た言語なのですが、文法を決めるにあたって、「ここはCの文法から変えた方がいいと思うんだけど、Cに慣れた人の混乱を招きそうだしなあ」ということで、結局Cに合わせた、という点がいくつかあります。
今回はそのメモでも書いていこうかと。
タイトルの「自転車置き場の議論」というのは、こちら等を見てもらえると説明がありますが、「どうでもいいようなことほど議論が紛糾してしまう」現象だそうです。実際、この手の瑣末な文法の話は、慣れてしまえばどうとでもなる話だと思うんですがね。

代入演算子

代入演算子といえばCやJavaでは「=」ですが、Pascalから派生した言語では「:=」です。
言語を作るにあたり、

  • 代入に「=」を使うのは数学の意味の等号と違うから変だろう。
  • といって代入に「:=」、等号に「=」というのも、Cに慣れた人が間違えるだろう。
  • じゃあ代入に「:=」、等号に「==」にすればよいかな。

と考えたこともあるのですが… 結局Cに合わせました。

ifとかの後ろの括弧

Cとかで許されているぶらさがり文(下記のような文)は、いろいろと混乱を招くためcrowbarでもDiksamでも禁止されており、必ず中括弧({})が必要です*1

if (a == 0)
   b = 0;

だとすれば、ifの直後の括弧は不要で、

if a == 0 {
   b = 0;
}

と書けばよいかな、と思えます。実際crowbarのver.0.1ではそうしました。
…が、やってみるとこれが私自身間違えてしょうがないので(forでは間違えると文法エラーですし)、結局戻しました。

ブロックの後ろのセミコロン

大昔、こっちに書いたのですが、Cでは、文の後ろには通常セミコロンが要るくせに、中括弧の後ろには不要です。これは統一が取れていないと思うので、中括弧の後ろにも強制しようかと思ったのですが… Adaとかだとendの後ろにも要るわけですし。
これも結局Cに合わせました。

インクリメント・デクリメント演算子

Cだと、++や--は演算子であり、オペランドの前にも後ろにも書けます。これを使うといろいろ込み入った式が書けてしまう上、前置と後置の動きの違いも謎なので、いっそ++や--は文にしてしまって、前置しか許さないようにしようかとも思いました。私自身はインクリメントやデクリメントはそれだけを独立した行に書きますし。
が、そうするとfor文の第3式で書けなくなります。もっとも、for文の第3式は本来文が書けてよい場所だと思うので、そのように文法を修正するという手もあるのですが、これまた慣れた文法と違ってしまうと辛いのでCに合わせました… 前置か後置かは、「私自身が後置派だから」という理由で後置に決定。
つか、これ言い始めると、式文廃止したほうがいいんじゃないかってことになりますし、それもまた手かと思うんですけどね。

結局

他にも思い出したら追記します… (最近一番でかいのは、宣言の構文についてのものでしたが)。
仮にもプログラミング言語をゼロから作ろうというんだから、「既存言語に慣れた人のため…」などと媚びたこと言ってないで好き勝手に俺様ワールドを作ればよいではないか、という考え方もあるとは思います。が、どんな言語でもファーストユーザは自分自身なわけで、私自身が混乱してしまうようでは意味がない、ということでこうなってます。
PerlRubyPHPは結構いろいろいじってるので、変えてしまってもよかったのかもしれませんがね。うーん。

*1:アメリカと日本とでは大括弧、中括弧、小括弧の順序が異なるので、何が中括弧かという疑問はありますが…