Dartのissueから適当にAccepted扱いのものを拾って紹介してみる。Acceptedになっているからと言って必ず実装されるわけでもないし、実装されるにしても遠い将来になる可能性もあるので、あくまで参考程度に。
全般
ソースコード内でnon-ASCIIキャラクターを使用可能にする
多バイト文字ソースコードをサポートししている言語は意外とある。実用性については不明だ。
typedefを関数以外でも使えるようにする
そもそも関数にしか使えない現状がおかしいのだが。
global限定子
この限定子のお世話になるようなソースコードは拝みたくない。
契約による設計(Design by Contract)
Eiffelで採用されているようなDbCのことだろう。
パターンマッチング
ScalaやOCamlにもあるやつだろう。モダンな言語としてはこれぐらいは欲しいところだ。
lazy val
scalaの機能。遅延評価。
readonly修飾子
finalと違い、そのメンバへの代入も禁止する。
Iterableに加えてIteratorもfor-in内で使用可能にする
Object.isNull
null判定がやりやすくなるはずだ。
クラス
Optionクラス
nullをうまいこと扱えるクラス。モダンな言語ならだいたい搭載していると思われる。
クラス内クラス
今のDartはクラス内でクラスを宣言することができない。
proxyクラス
- https://code.google.com/p/dart/issues/detail?id=5641
- https://code.google.com/p/dart/issues/detail?id=20705
現状でもproxyクラスを作れないことはないが手間がかかる。
クラスをファーストクラスオブジェクトにする
クラスプライベートなメンバ
Dartはライブラリプライベートしかサポートしていない。
型パラメータTをnew可能にする
new T()したいらしい。そんな処理が必要になるのは設計がまずいと思うのだが。
デフォルトのgetter/setterをオーバーライド可能にする
デフォルトのgetter/setterはオーバーライドできないので、privateな変数を用意してからgetter/setterを別に用意するのだが、その手間がなくなる。
numやStringを拡張可能にする
今は禁止されている。
関数(メソッド)
末尾再帰最適化
なぜこれが実装されていないのかは謎だが、とにかく今のDartは末尾再帰最適化をしていないらしい。
メソッドのジェネリクス
メソッドにもジェネリクスを。
const関数
C++のconst関数。オブジェクトの状態を変更しないことを明示する。
非定数デフォルトパラメータ
パラメータのデフォルト値に定数でない値を指定できる。
(params) -> returnType nameでの宣言
場合によっては多少読みやすくなるかもしれない。
関数合成
- https://code.google.com/p/dart/issues/detail?id=18522
- https://code.google.com/p/dart/issues/detail?id=16900
restパラメータ
JavaScriptにもあるのだからこれぐらいは欲しい。
相互再帰
関数型言語によくある相互再帰。
リテラル
Setリテラル
- https://code.google.com/p/dart/issues/detail?id=174
- https://code.google.com/p/dart/issues/detail?id=3792
Setもリテラル表現がほしい、ということらしい。
2進数リテラル
0b1000みたいなやつ。
charコードリテラル
C言語のような文字コード定数。
rangeリテラル
python等で使われている[a … b]という形式のリテラル。
定数関数リテラル
関数リテラルも定数扱いにしたいらしい。
演算子
二項演算子のクロージャ化
シンタックスはまだ決まっていないらしい。
存在演算子
Swiftなどで使われている演算子。変数がnullでない場合だけ後の処理を実行する。nullチェックの手間を省くもの。
デフォルト演算子
a = (b == null) ? c : b
を、例えば??という演算子を導入して、
a = b ?? c
と書けるようにする演算子。
べき乗演算子
pythonで使われている**演算子。
スプレッド演算子
groovyにあるらしい。
parent*.action;
が
parent.forEach((child) { child?.action; });
と同等になるようだ。
スライス演算子
pythonで使われている。String.substring()のシンタックスシュガー。
複数パラメータを取る[]と[]=
多次元配列の表現などに。