English title: Not yet merged new features for D
This talk introduces some proposed (and not yet merged) new features for D Programming language.
This presentation is written in Japanese.
前振り 新機能 まとめ
NogcPatMatch UTS DDMD
Implement nogc framework
@nogc 属性の追加
例
@nogc auto foo() {
// new 式が GC.malloc を呼ぶのでエラー!
auto arr = new int[4];
}
GC を呼ぶ関数かどうかをコンパイル時に検出してくれる!
でも…
エラーになるべきじゃない! by yebblies
int main()
{
return [1, 2, 3][1];
}
Tomoya Tanjo
D 言語にまだ入っていない新機能
8.
前振り 新機能 まとめ
NogcPatMatch UTS DDMD
Implement nogc framework
更に…
これも動くべき! by 9rnsr
enum n = () { auto a = [1,2,3]; return a[0] + a[1] + a[2]; }();
つまりどういうことなの?
CTFE される関数に関しては GC 呼んでもいい!
CTFE: コンパイル時関数実行
現状
最初は -nogc スイッチで検出するかどうかを切り替えようと
してた
今はデフォルトで有効にする方向っぽい
Tomoya Tanjo
D 言語にまだ入っていない新機能
9.
前振り 新機能 まとめ
NogcPatMatch UTS DDMD
おまけ: その他の属性との対比
@trusted (メモリ安全性)
外部に見せなければ,@trusted 関数内でシステム関数を使っ
てもよい!
システム関数: 引数によってはメモリ破壊の可能性のある関数
pure
外部に見せなければ,pure 関数内でローカル変数の書き換え
をしてもよい!
@nogc
コンパイル時であれば GC 呼んでもいい!
少し条件をゆるめて利便性を確保する,という点で D 言語っぽい
Tomoya Tanjo
D 言語にまだ入っていない新機能
10.
前振り 新機能 まとめ
NogcPatMatch UTS DDMD
Functional pattern matching for object references
Phobos Pull Request #1266
Bugzilla #9959
要約: 関数型言語がやってるようなパターンマッチが欲しい
二分木の定義と走査 (Haskell の例)
data Tree = Leaf Int | Node Tree Tree
summation::Tree -> Int
summation (Leaf a) = a
summation (Node l r) = (summation l) + (summation r)
最後の 2 行みたいなことを D でやりたい!
Tomoya Tanjo
D 言語にまだ入っていない新機能
11.
前振り 新機能 まとめ
NogcPatMatch UTS DDMD
Functional pattern matching for object references
多態使えば一応できる
二分木の定義と走査 (D での例)
class Tree{}
class Leaf: Tree { int a; }
class Node: Tree { Tree l, r; }
auto summation(Tree t)
{
if (auto leaf = cast(Leaf) t) // キャスト 1 回目
return leaf.a;
if (auto node = cast(Node) t) // キャスト 2 回目
return summation(node.l) + summation(node.r)
assert(false);
}
毎回キャストしてるのがイマイチ
Tomoya Tanjo
D 言語にまだ入っていない新機能