* プログラミング言語 Essen #3 -(by [[K]], 2016.08.07) ** これはなに? -まずは[[Essen]]と[[Essen1]]を読んでね。ここは続きを書きます。 -このページでは、なぜEssenがこういう仕様を目指したのかという話を書いておきます。 ** (1) scanfから考えてみる。 -scanfは代入したい変数が引数側にある。[[K]]はこれがどうにも許せない。 --scanf("%d %d", &a, &b); -このaやbは関数の返値として記述したい。その方が[[K]]にとっては直感的だ。 --(a,b)=scanf("%d %d"); -Essenでは、この形式を目指したけど、それはうまくいかなかった。でも以下の書き方ならいけそうである。そしてこれは十分に許容範囲だ。 --&(a,b)=scanf("%d %d"); -C言語などの場合、scanfがどんな型を返すのか定義時に固定しなければいけない。しかし上記みたいなことをしたいのならそれはしたくない。 --stdarg.hによって引数のほうはかなり自由に書けるけれど、返値については自由にする方法がない。 -そこでEssenは関数がどんな型を返すのかを固定しないことにした。変数にも型はない。値に型がある。 -しかしこの仕様はコンパイラを作るうえでは高速化の障害になるだろう。それはわかっている。でもまずはコンパイラのことは気にしないでやってみることにした。 ** (2) 変数の交換 -変数を交換する関数swapがあったとする。C言語なら swap(&a, &b); と書いて呼び出すことになるだろう。C++なら参照型が使えるから swap(a, b); と書くことができるだろう。これはすばらしい。毎回&を付けるのは煩雑になるだけだから。 --もちろん&を付けることによって、この関数呼び出しによってaやbが書き換わりうることを表現できているともいえるのだけど。 -しかしやはり引数のほうが書き換わるという仕様は[[K]]には気持ち悪い。値の変更は代入によって引き起こされるべきである。そんなわけでEssenではこうなった。 --&(a, b) = (b, a) -これはわかりやすいし簡潔だ。同様のことはRubyでもできる。 * こめんと欄 #comment