d言語にまだ入っていない新機能 (dの日#2)
DESCRIPTION
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.TRANSCRIPT
前振り 新機能 まとめ
D言語にまだ入っていない新機能
Tomoya Tanjo
2014年 2月 27日Dの日 2
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ 自己紹介 D 言語
自己紹介
Twitter とか Github とかで活動中(Twitter: tm tn, Github: tom-tan)
Phobos の関数に @safe とか pure とか付けてます
作ったものとかやったこととか
Flycheck の D言語対応
Flycheck-d-unittest
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ 自己紹介 D 言語
D!
そんなことよりD言語
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ 自己紹介 D 言語
最近のD言語
The D Programming Language (TDPL) 発売日本語版も出ました!
Facebook が D言語をプロダクションに利用
雑誌に紹介記事が載る (日経ソフトウエア 2014年 4月号)
DMD 2.065 リリース! (4日前)
D言語が熱い!
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ 自己紹介 D 言語
今回のお話
D言語のコンパイラ (DMD),ランタイム (Druntime),標準ライブラリ (Phobos)は Github上で開発されています
機能追加やバグ修正は,Pull Request として管理されている
Pull Request の中から面白そうなものを紹介します
そのまま新機能として入るかもしれない
入らないかもしれない
文法変わるかもしれない
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
Implement nogc framework
DMD Pull Request #1886
D言語は静的型付けのコンパイル型の言語メモリ管理には GCを採用やろうと思えば malloc/free で手動管理もできる
ゲームとかでも使われてたりするGCを動かしたくない配列の使用や new式等を使うと GCが動いてしまう
GCを動かさないようにコードを書くサポートが欲しい
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch 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 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch 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 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
おまけ: その他の属性との対比
@trusted (メモリ安全性)外部に見せなければ,@trusted関数内でシステム関数を使ってもよい!システム関数: 引数によってはメモリ破壊の可能性のある関数
pure外部に見せなければ,pure関数内でローカル変数の書き換えをしてもよい!
@nogcコンパイル時であれば GC呼んでもいい!
少し条件をゆるめて利便性を確保する,という点で D言語っぽい
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
Functional pattern matching for object references
Phobos Pull Request #1266
Bugzilla #9959
要約: 関数型言語がやってるようなパターンマッチが欲しい
二分木の定義と走査 (Haskellの例)
data Tree = Leaf Int | Node Tree Tree
summation::Tree -> Intsummation (Leaf a) = asummation (Node l r) = (summation l) + (summation r)
最後の 2行みたいなことを Dでやりたい!
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch 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 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
Functional pattern matching for object references
std.algorithm に castSwitch 関数を追加しよう!
二分木の定義と走査 (castSwitch)
auto summation(Tree t){
return t.castSwitch!((Leaf leaf) => leaf.a,(Node node) => summation(node.l) + summation(node.r),(Object ) => assert(false),
)();}
現状ソースにいくつか突っ込みが入っているものの,入れることに反対の人はいない様子そのうち入るかも
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
Uniform tuple syntax
DIP 32DIP: D Improvement Proposals
パターンマッチっぽい物つながり
castSwitch がライブラリ関数だったのに対して,こちらは言語機能の拡張の提案Tuple?
色々入れられる無名構造体みたいなもの現在は std.typecons 内で定義されている型
Tupleの使用例
import std.typecons;auto t = tuple(1, “hi”); // int と string を持つ構造体assert(t[0] == 1); // インデックスでアクセスできる
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
Uniform tuple syntax
DIP 32: std.typecons で定義されている Tuple 構造体を言語機能に入れよう!
組み込みタプルの使用例
auto t = {1, “hi”}; // int と string を持つ構造体assert(t[0] == 1); // インデックスでアクセスできる
std.typecons.Tupleとの違いは?
unpacking まで提案されていること
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
Uniform tuple syntax
組み込みタプルの使用例 その 2
auto {x, y} = {1, “hi”}; // int と string を同時に宣言 & 初期化!switch (tup) { // パターンマッチ!
case {1, 2}:case {$, 2}: // $はワイルドカードcase {1, x}: // x は tup の 2番目の要素で初期化されるdefault:
}
std.typecons.Tupleの unpacking関数 (tie) には問題があったのか,現在は std.typecons 内には見当たらない現状
最近はML上の話題にはなっていない構造体の初期化と構文がかぶり,破壊的更新が起きるので導入に慎重になっている?個人的には期待
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
[DDMD] Current patch list
DMD Pull Request #1980
Open されたのが 10ヶ月前
DDMDとは?
D言語で実装された D言語処理系DMDは C++で書かれている
以前にも DMDを Dに移植するプロジェクトがあったが頓挫している
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
[DDMD] Current patch list
DDMDのマイルストーン
C++ を D にコンバートするプログラムを作成し,DMDのソースを Dに変換できるようにする (!)
DMD の Makefile に,DMDのソースから DDMDを作成するターゲットを追加する
. . .
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
[DDMD] Current patch list
現状C++ を D にコンバートするプログラムを作成し,DMDのソースを Dに変換できるようにする (3日ほど前に完了)
Pull Requestの数は 230以上
DMD の Makefile に,DMDのソースから DDMDを作成するターゲットを追加する
. . .
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ Nogc PatMatch UTS DDMD
[DDMD] Current patch list
git-head が変更なしに D に変換できる! (らしい)
コンバートツール: magicport2(https://github.com/yebblies/magicport2)
試したかったけど時間が取れず…
近い将来 DDMD が標準になるかも
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ
まとめ
新機能とか眺めてるだけで楽しい!
触れられなかったものstd.lexervirtual キーワード
意外と破壊的更新が少ない
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ
おしまい
ありがとうございました!
Tomoya Tanjo D 言語にまだ入っていない新機能
前振り 新機能 まとめ
関連リンク集
D言語公式 (http://dlang.org/)
日本語版 (http://www.kmonos.net/alang/d/)
Github (https://github.com/D-Programming-Language)
D Wiki(http://wiki.dlang.org/The D Programming Language)
d-manual (https://github.com/k3kaimu/d-manual)
D言語友の会 (http://dusers.dip.jp/)
オンラインコンパイラサービスDPaste (http://dpaste.dzfl.pl/)Wandbox (http://melpon.org/wandbox/)ProcGarden (http://sc.yutopp.net/)D REPL (http://drepl.dawg.eu/)
Tomoya Tanjo D 言語にまだ入っていない新機能