kepler (scalamacros)について
DESCRIPTION
http://scalamacros.org/ について。 ドワンゴのScala勉強会で発表するはずでしたが、体調不良で欠席しましたので資料だけアップロードしますTRANSCRIPT
Kepler について小宮山 純平 (twitter@dekosuke)
2
マクロの話をしますProject Kepler (ライブラリ、というより提
案)の紹介をします
はじめに
3
Kepler は提案なので現在ではなく未来の話です
はじめに
4
コードを生成してから、スカラのコンパイラが実行される前に何かやりたいですよね
要するにマクロ(プリプロセッサ)Scala にはコンパイラプラグインがあっ
て、 scalac の各段階で処理が挟めます( scala-virtualized とかは使ってるらしいです)
Project Kepler (scala への macro の提案 ) の話をしましょう!
コンパイル時メタプログラミング
5
Project Kepler by Eugene Burmako
http://scalamacros.org/
Scala にマクロを持ち込みたい!
Project Kepler
6
C 言語のマクロは悪名高い
マクロの悪名
7
C 言語のマクロは悪名高い
そもそも C++ のテンプレートが提案された理由は C 言語マクロほど凶悪でないプリプロセッサがほしからでした
マクロの悪名
8
C 言語と違ってScala そのもので書かれている(言語外の何か
ではない) 式木の上での変換(生の文字列を操作したりし
ない)Scala の文法を変えない
Project Kepler のマクロ
9
マクロ(コンパイル時メタプロ)の利点として コード自動生成と違ってコード量が増えない
Project Kepler のマクロ
10
// こんなマクロを書くとmacro def printf(format: String, params: Any*) { val (evals, refs) = parse(format, params) val seq = evals + refs.map(x => c"print($x)") c"$seq"}
// 型安全な printf がprintf("Value = %d", 123 + 877)
// こう展開されるよval p1 = (123 + 877): Intprint("Value = "); print(p1)
例 : 型安全な printf ( 関数マクロ )
11
macro trait MySqlDb(connString: String) = …
type MyDb = Base with MySqlDb("Server=127.0.0.1;Database=Foo;")
例 :DB ( 型マクロ )
Scala の文法の自然な拡張(意味のないおまじないを増やさない)
12
Boilerplate
「すべての Boilerplate を消し去りたい!」
trait TupledFunctions extends Functions with TupleOps { implicit def fun[A1:Manifest,A2:Manifest,B:Manifest](f: (Rep[A1], Rep[A2]) => Rep[B]) : Rep[((A1,A2))=>B] = fun((t: Rep[(A1,A2)]) => f(tuple2_get1(t), tuple2_get2(t))) implicit def fun[A1:Manifest,A2:Manifest,A3:Manifest,B:Manifest](f: (Rep[A1], Rep[A2], Rep[A3]) => Rep[B]) : Rep[((A1,A2,A3))=>B] = fun((t: Rep[(A1,A2,A3)]) => f(tuple3_get1(t), tuple3_get2(t), tuple3_get3(t))) ... }
言語のおまじない
13
現状
“being specified and refined within a Scala improvement process (aka SIP #14).”
14
未完
End