無名関数?について

SiroKuroさんのトラックバックがあったので返信。

たしかにfun(c)c+1 が文脈的に特別扱いしているように見えますね。修正しないと。
演算子は無名関数以外にfor,if else ,while,do while,等とc言語の構文の多くを表すことを目的としています。だから、funを特別扱いしているわけではありません。


この文演算子は導入するかどうか悩んだ演算子です。
演算子のメリットはいろいろな構文が単文を取ることができるようになることです。

for(i=0;i<10;i++)println(i)
if(a) b else c;
while(a) b;
do{a++}while(a<10);
try{}catch{}

まさに、C言語の特徴を現している演算子だと思うのですがどうでしょうか?
そして、この枠組みがあることによって、try catchやswitchのよりよい記述方法があるのではと
考えるきっかけにもなります。実際、Scalaはcatchの部分の分法を変えたりしてますよね。switchはパターンマッチを導入するために変えている部分が大きいですけど。
この文演算子がないと以下のような表記になると考えています。

for(i=0;i<10;i++){println(i)}
if(a) {b} else {c}
while(a){b}
do{a++}(a<10)

do whileがうまくできなくなったり、if(a){b}と{c}をelse2項演算子がつなぐ事になります。
rubyのifが常にendで終わるように括弧が常に必要であるというのはひとつの手だと思っています。
{}がないとわかりにくいっていう話は結構ある話なのですけど。

この演算子の導入はしないほうがいいのかもしれませんがC言語に近いほうがよいだろうと導入することにしました。javascript1.8でfunction(a)a+1と書けるようになったことも影響しています。


たしかに演算子ですべて構成するということは文法の作成に制限が加わることに繋がります。
だから、こういうのが好みだと思ってもすぐに実現できません。
それが自由を失う、使い勝手が悪くなると思うことに繋がるのかと思います。
私が考えている言語が正確に正規木文法になっているかどうかはわかりません。(学者でないので)
文脈自由文法は正規木文法を含み、正規木文法は文脈自由文法としても処理できるそうなので、
文脈自由文法の範囲で扱う分には不便はしないのも事実だと思います。


しかし、この制限があるおかげで、LISP相当のマクロをシンプルに作ることができるのです。
言語設計者は自由と引き換えに言語により強力な力を持たせることができるのです。
丹念に探せば好みのものに近いものが見つかります。たとえば今回の文演算子がそれです。