* プログラミング言語 Essen #3
-(by [[K]], 2016.08.07)
** これはなに?
-まずは[[Essen]]と[[Essen1]]を読んでね。ここは続きを書きます。
-このページでは、なぜEssenがこういう仕様を目指したのかという話を書いておきます。

** (1) scanfから考えてみる。
** (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でもできる。

** (3) セミコロンの省略
-現在のEssenの仕様では、文末のセミコロンは省略できる。そのため、
--a = 3  b = 4  c = 5
-みたいな書き方ができる。これは気持ち悪いと感じるかもしれない。
-まず、セミコロンの省略は「可能な選択肢」なのであって「義務」ではない。だから気持ち悪ければ省略しなければいいだけである。
-なぜこんな仕様を採用したのか。・・・初期のEssenではif文やfor文や関数宣言の末尾にセミコロンが必須だった。なぜならそれは「文末」だから。でもCやC++ではそんなものは書かない。だからできれば書かなくてもいいようにしたかった。
-加えて行の末尾のセミコロンが省略できたら、ちょっと便利かもしれないなと思うことは何度かあった。現在の仕様ならこれも受け入れられるので、面白いなと思った。

** (4) 関数宣言の構文
-Essenの関数宣言構文は以下のとおりである。
 func = function(x, y, z)
 {
     ...
 }
-つまりfunctionが関数を作る演算子で、その結果を変数funcに代入しているだけである。
-関数も第一級のオブジェクトとして扱われるべきだし、それにはこの構文が一番適していると思う。


* こめんと欄
#comment


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS