Dartに求めるもの

Googleから新しいプログラミング言語 Dart が発表された。

内容を見るかぎりとても実用的なすばらしい言語に思える。どこら辺が実用的かと言えば、Java言語そっくりなシンタックス(既存言語と似たシンタックスを用意することは、広く利用される言語になる条件のひとつだ)、それでいてJava言語で不満とされていた点の解消(instanceof が is になったり、setter, getterなど C# で改善された有用な要素が追加された反面、C#で追加された変な機能は取り込まれていない)が行われ、さらに動的言語機能やShell上での実行を考慮してスクリプトタグ「#!」が追加されている。

Java言語のすばらしさは、不便でない程度に簡潔な仕様に収めた点である。よく、「ある言語には存在する○○という機能が××にはないから駄目だ」という議論が行われることがあるが、機能というのは追加するだけならそう難しくはない。むしろ、重要なのは「不必要に機能を追加しない」ことである。今のところ、Dartにもそれができているように感じる。

ただ、前言に反するような話も含まれるが個人的には細かい不満もある。実際にそれが望ましいかは別として、とりあえず思いつくままに列挙してみる。

条件式の挙動

まず、if文に書ける条件式が、チェックモードだとJava同様、結果が true/falseのみ、チェックなしモードの挙動はよくわからのだが実行した限り JavaScriptと同様にnull、ゼロ幅の文字列、数字のゼロも偽扱いのようだ。

しかし、これに関しては、Ruby 同様に null と false のみ偽とした方がよいと思う。null が偽の扱いなのは自然であるし、冗長な多くの null チェックが不要になるだけでなく、OR句を使って新たに演算子を追加することなく、デフォルト値指定ができる(JavaScript だと var a = x || 'default'; と書くことで null の際のデフォルト値指定ができるが、0が偽となるため明らかに数値が来ない場合にしか利用できない)。

Rubyだと本当はNilクラスがあるので、そこまですべきではないか、という話もあるが、演算子オーバーロードと同じで誤用が発生しそうなので、無くても構わないと思う。

演算子オーバーロードがある

いや、あってもいいんだけど num インターフェイスの実装クラスだけに制限してほしいな、と。

コンストラクタの名前がクラス名

これはJavaと同じなのだが、C# のようにコンストラクタ名は this に統一してくれないだろうか。ひとつのクラス内に同じ名前を何度も書かなければならないのは大変面倒であるし、特にクラス名が長い時は見た目も悪い。

公開メソッドは、型名の明示を強制してほしい

動的型言語の欠点であるが、自動生成したドキュメントを見ても、引数の型がわからず困ることが多い。Dartでは、書いても書かなくてもよいというルールになっているようだ。

個人的にはprivateメソッドやローカル変数はともかく、公開される情報には型名が明示された方がよいと考える。

アクセス制御が弱い

ドキュメントをきちんと読めてないのかもしれないが、Dartではpublicとprivateしかないようだ。Javaのアクセス制御はうまく機能していないのでより簡潔にしたのはよいと思うが、ライブラリ製作者からすると、ライブラリ内のみ公開という制御はどうしても欲しい。eclipse plug-inのルールのようにパッケージ名として internal を含む場合は外部からはアクセスできないなどの方式でもよいとは思うが、何らかのものがほしい。

正規表現がライブラリ形式での提供となっている

昨今の言語としては珍しいことに正規表現機能がJava同様、クラスとしての提供となっている。簡潔さを考えると含めない方がよいとも考えられるが、現在のプログラミング環境を考えると、あるのが当然のようにも思える。

値型と複合型を判別するインターフェイスが用意されていない

JSONICを作っていたときにとても困ったのが、自作のクラスをJSONマッピングするとき、StringやNumberといった単純型にマップするべきかMapなどの複合型なのかを区別する方法がないことだったりする。boolやnumといったインターフェイスが用意されているので、その延長線上で strやstructなどのインターフェイスを用意してほしい。

in 句がほしい

for in ループとかぶるので微妙なところがあるが、なぜ世の中のプログラミング言語には PL/SQLライクな IN 句がないのだろうといつも思っている。ようするに、a in (3, 4, 5) と書くと (a == 3 || a == 4 || a == 5) に展開してほしい。いや別に a == (3, 4, 5) とかでもいいけど。そういえば、何かの言語では 10 <= a < 20 みたいな書き方ができたけど、こういうのも良いよね。

Iterable/Iterator インターフェイスがある

外部イテレータは、使うのはともかく作るのが難しすぎる。クロージャもあるんだから forEach メソッドだけで良いんじゃなかろうか。

ロギングインターフェイスがない

Javaの失敗を繰り返さないように、commons-logging相当のインターフェイスを最初から用意しておくべき。実装は差し替えられるようにさえなっていれば、標準出力に垂れ流しでも一向に構わないし。

while {} else {} がない

まぁ、これはどうもPythonにしかない機能のようなのだが、while文が一度も実行されなかった時に呼ばれる else 句というものがある。とても自然であるし、キーワードも増えない辺り実にすばらしいので Dart でも加えてみてはどうだろうか。

[追記] リソース管理で思い出したが、「C++/CLIはC#を凌駕するかも知れない…… usingステートメント不要のDisposeメソッド呼び出しの衝撃」の仕様は、新たな言語に組み込むならばなかなか良いように思える。これがあれば using も try (...) も不要だ。