Dartで鋭意検討中の新機能

# 新機能案のリポジトリ
言語レベルでの新機能の課題、要求、解決策は下記GitHubリポジトリのissuesで管理されています。
[dart-lang/language: Design of the Dart language](https://github.com/dart-lang/language "dart-lang/language: Design of the Dart language")

その前は[Dart Enhancement Proposal(DEP)](https://github.com/dart-lang/dart_enhancement_proposals "dart-lang/dart_enhancement_proposals: This repo contains info on DEP - Dart Enhancement Proposal")でしたが変更になったようです。

# 現在開発中の新機能
上記の内[`state-active`](https://github.com/dart-lang/language/labels/state-active "Issues · dart-lang/language")ラベルがついている機能を一言ずつ、簡単に紹介します。
比較的大きな改善が見込まれる項目が多く見られます。
Dart 2.0が出るまでは型安全(多くが静的)に専念する形でしたが、ようやく大物や新機能に手が出せるようになった、という感じですかね。

## [Set literal](https://github.com/dart-lang/language/issues/37 "Set literal · Issue #37 · dart-lang/language")
Setのリテラルが書けるようになります。

```dart
var a = <int>{1, 2, 3};
```

## [Make it an error to use a type variable non-covariantly in a superinterface](https://github.com/dart-lang/language/issues/39 "Make it an error to use a type variable non-covariantly in a superinterface · Issue #39 · dart-lang/language")
省略 (^_^;)

## [Static Extension Methods](https://github.com/dart-lang/language/issues/41 "Static Extension Methods · Issue #41 · dart-lang/language")
`int`とか`String`とか、既存のクラスにメソッドが追加できるやつ。
Kotlinいいなー、という声に答えて。

## [Spread Collections](https://github.com/dart-lang/language/issues/47 "Spread Collections · Issue #47 · dart-lang/language")<br>[Control Flow Collections](https://github.com/dart-lang/language/issues/78 "Control Flow Collections · Issue #78 · dart-lang/language")
Javascript(ES6)のスプレッド構文相当。
JavascriptにできてDartにできないのはDartのプライドが許さない?
後者は条件分岐とかも書けるように。
FlutterのWidgetで宣言的雰囲気を保ったまま`children:`の要素を制御したりとか。
UIをdartで宣言的にも手続き的にも書けるのがFlutterのメリットだけど、現時点で宣言的表現力がJSXに劣る部分を補完。

## [Minimal Unicode grapheme cluster support](https://github.com/dart-lang/language/issues/49 "Minimal Unicode grapheme cluster support · Issue #49 · dart-lang/language") <br> [Minimal non-integer-index Unicode grapheme cluster support.](https://github.com/dart-lang/language/issues/52 "Minimal non-integer-index Unicode grapheme cluster support. · Issue #52 · dart-lang/language")
ぐらふぇむくらすたーって何だ? と思ったら、最近↓を読んだことを思い出したので、それでお茶を濁す。
[C++標準化委員会、ついに文字とは何かを理解する: char8_t - Qiita](https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b "C++標準化委員会、ついに文字とは何かを理解する: char8_t - Qiita")

## [Constant Specification Update 2018](https://github.com/dart-lang/language/issues/61 "Constant Specification Update 2018 · Issue #61 · dart-lang/language")
定数コンストラクタの初期化リストにおいて、コンストラクタ引数に`is`とか`as`を適用したものも定数式として扱うように。

```dart
class MyClass {
  final String value;
  const MyClass(Object o) : value = (o is! String) ? "$o" : (o as String);
}
```
あいかわらず定数コンストラクタの引数を使って他の定数コンストラクタを呼び出すことはできない。
[Dartの定数は定数を内包できない? ⇒ Dart 2で出来るようになりました ⇒ なってませんでした - Qiita](https://qiita.com/Cat_sushi/items/69974c556bd161df589e "Dartの定数は定数を内包できない? ⇒ Dart 2で出来るようになりました ⇒ なってませんでした - Qiita")

## [Type aliases: Typedefs for non-function types](https://github.com/dart-lang/language/issues/65 "Type aliases: Typedefs for non-function types · Issue #65 · dart-lang/language")
クラスを`typedef`出来るように。今は関数型だけ。

## [Terminating Tokens](https://github.com/dart-lang/language/issues/72 "Terminating Tokens · Issue #72 · dart-lang/language")
文末セミコロンを省略可能に。
KotlinやSwiftとの比較でとかく非難されがちだったし、JSへのアンチテーゼのつもりで必須にしたら、後発で省略可能なTypeScriptに人気で抜き去られたので。

## [Per Library Language Version Selection](https://github.com/dart-lang/language/issues/94 "Per Library Language Version Selection · Issue #94 · dart-lang/language")
Dart１→2マイグレーションとか、来たるNNBDマイグレーションとか用？

## [Sound non-nullable types with incremental migration](https://github.com/dart-lang/language/issues/110 "Sound non-nullable types with incremental migration · Issue #110 · dart-lang/language")
お待ちかねNull安全議論の再始動です。
KotlinやSwiftとの比較でとかく非難されがちだったし、JSに寄せたつもりですべてNull可にしたら、後発でNull安全なTypeScriptに人気で抜き去られたので。

## [Dart integers have no logical down-shift operator.](https://github.com/dart-lang/language/issues/120 "Dart integers have no logical down-shift operator. · Issue #120 · dart-lang/language")
任意精度整数で(負数の)論理右シフトとかイミフということで一度消えた機能。
Dart2.0でintを任意精度から64bitに変更したときの復活し忘れ。
ちなみに、任意精度でも右シフトは定義できる。
正数なら`floor(x/2)`、負数なら`-floor(-x+1)/2)`、0なら`0`。

## [The `async*` function `yield` should work well with `await for`.](https://github.com/dart-lang/language/issues/121 "The `async*` function `yield` should work well with `await for`. · Issue #121 · dart-lang/language")
仕様に忠実な実装と、それによる高速化だそうな。
あれ、ここは仕様を議論する場所じゃなかったけ？

# おわりに
気が向けば来年も。

# 現在開発中の新機能 (2018/12/31追記)
上記ではissuesの[`state-active`](https://github.com/dart-lang/language/labels/state-active "Issues · dart-lang/language")ラベルが付いたものを拾いましたが、[language/working](https://github.com/dart-lang/language/tree/master/working "language/working at master · dart-lang/language")というディレクトリがありました。ここにはissuesに挙がっていない機能も有りますし、[`state-active`](https://github.com/dart-lang/language/labels/state-active "Issues · dart-lang/language")は議論がアクティブであるのに対し、[language/working](https://github.com/dart-lang/language/tree/master/working "language/working at master · dart-lang/language")は開発がアクティブのようです。ドラフトのProposalとかも有ります。
[language/working](https://github.com/dart-lang/language/tree/master/working "language/working at master · dart-lang/language")に有って[`state-active`](https://github.com/dart-lang/language/labels/state-active "Issues · dart-lang/language")に無い機能を追加で紹介します。

## [Implicit Constructor](https://github.com/dart-lang/language/issues/108 "Implicit Constructor proposal · Issue #108 · dart-lang/language")
暗黙型変換用のコンストラクタ。
例えば、`Uri`を期待する文脈(API等)で`String`を指定すると、`implicit`とマークされ、`String`引数をひとつだけ取る`Uri`のコンストラクタが自動的に適用されます。

```dart
class Uri {
  // Note: parse is currently a static function on Uri, not a constructor.
  implicit Uri.parse(String uri) => ...
}
```
Dartにはハンドクラフトな`FutureOr<T>`を除くUnionタイプが未実装ですが、その一部のユースケースが拾えそうです。
`[1, 2, 3].map((x)=>(x*x))`は`Iterable`になってしまいますが、`.toList()`し忘れも適切に処理されそうです。

`const`コンストラクタも念頭にありますが、Dart 2.1で導入した[Evaluating integer literals as double values](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/int-to-double.md "sdk/int-to-double.md at master · dart-lang/sdk")とぶつかって曖昧になりそう。後者は`int`(64bit)で溢れるリテラルの解釈(本来の目的には無けど)等のきめ細かな対応があるので、こちらを優先する特別ルールが出来ると思います。

## [Shared immutable objects](https://github.com/dart-lang/language/blob/master/working/0125-static-immutability/feature-specification.md "language/feature-specification.md at master · dart-lang/language")
いわゆるdataクラス。
とはいえ、機能名の通り、`Isolate`間で共有することが目的。

## [Enhanced Type Promotion](https://github.com/dart-lang/language/pull/79 "Move over "Enhanced Type Promotion" proposal. by munificent · Pull Request #79 · dart-lang/language")
`Object o;`を仮定した時、`if (o is String) {o.length();}`が許されるのに、 `if (o is! String) {} else {o.length();}`が許されない等の対策。
[improve type promotion in strong mode · Issue #25565 · dart-lang/sdk](https://github.com/dart-lang/sdk/issues/25565 "improve type promotion in strong mode · Issue #25565 · dart-lang/sdk")はどこまで拾われるんだろう。

# 現在開発中の新機能 (2019/1/21追記)
更に追加。
現在Projectsに[Language funnel](https://github.com/dart-lang/language/projects/1 "Language funnel")というプロジェクトが一つだけあります。Funnelを直訳すると漏斗(じょうご)という意味ですが、フェーズゲート管理用という意味でしょうか。この最初のフェーズ"Being discussed"に、まだここで取り上げていない機能が3つありました。

## [Multiple return values](https://github.com/dart-lang/language/issues/68 "Multiple return values · Issue #68 · dart-lang/language")
戻り値が複数書けるやつ。Swiftのタプル。Javascriptは配列とその分割代入でそれっぽくしているやつ。
そういえば、Dartに分割代入のアクティブな提案が無いなあ。
埋もれている提案はこちら。[Destructuring · Issue #24 · dart-lang/dart_enhancement_proposals](https://github.com/dart-lang/dart_enhancement_proposals/issues/24 "Destructuring · Issue #24 · dart-lang/dart_enhancement_proposals")

## [Experiment - Class annotation for disallowing use as a super-type, a.k.a "sealed classes"](https://github.com/dart-lang/language/issues/11 "Experiment - Class annotation for disallowing use as a super-type, a.k.a "sealed classes" · Issue #11 · dart-lang/language")
継承できないクラスを表すアノテーション。
現在`int`等の組み込み型の一部は特別ルールで継承不可だけど、フレームワーク等で定義する方法が無い。

## [Dart should support `&&=` and `||=` operators.](https://github.com/dart-lang/language/issues/122 "Dart should support `&&=` and `||=` operators. · Issue #122 · dart-lang/language")
説明不要ですね。というか、無かったんですね。