kepler (scalamacros)について

15
Kepler にににに ににに にに (twitter@dekosuke)

Upload: dekosuke

Post on 31-May-2015

1.281 views

Category:

Technology


3 download

DESCRIPTION

http://scalamacros.org/ について。 ドワンゴのScala勉強会で発表するはずでしたが、体調不良で欠席しましたので資料だけアップロードします

TRANSCRIPT

Page 1: Kepler (scalamacros)について

Kepler について小宮山 純平 (twitter@dekosuke)

Page 2: Kepler (scalamacros)について

2

マクロの話をしますProject Kepler (ライブラリ、というより提

案)の紹介をします

はじめに

Page 3: Kepler (scalamacros)について

3

Kepler は提案なので現在ではなく未来の話です

はじめに

Page 4: Kepler (scalamacros)について

4

コードを生成してから、スカラのコンパイラが実行される前に何かやりたいですよね

要するにマクロ(プリプロセッサ)Scala にはコンパイラプラグインがあっ

て、 scalac の各段階で処理が挟めます( scala-virtualized とかは使ってるらしいです)

Project Kepler (scala への macro の提案 ) の話をしましょう!

コンパイル時メタプログラミング

Page 5: Kepler (scalamacros)について

5

Project Kepler by Eugene Burmako

http://scalamacros.org/

Scala にマクロを持ち込みたい!

Project Kepler

Page 6: Kepler (scalamacros)について

6

C 言語のマクロは悪名高い

マクロの悪名

Page 7: Kepler (scalamacros)について

7

C 言語のマクロは悪名高い

そもそも C++ のテンプレートが提案された理由は C 言語マクロほど凶悪でないプリプロセッサがほしからでした

マクロの悪名

Page 8: Kepler (scalamacros)について

8

C 言語と違ってScala そのもので書かれている(言語外の何か

ではない) 式木の上での変換(生の文字列を操作したりし

ない)Scala の文法を変えない

Project Kepler のマクロ

Page 9: Kepler (scalamacros)について

9

マクロ(コンパイル時メタプロ)の利点として コード自動生成と違ってコード量が増えない

Project Kepler のマクロ

Page 10: Kepler (scalamacros)について

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 ( 関数マクロ )

Page 11: Kepler (scalamacros)について

11

macro trait MySqlDb(connString: String) = …

type MyDb = Base with MySqlDb("Server=127.0.0.1;Database=Foo;")

例 :DB ( 型マクロ )

Scala の文法の自然な拡張(意味のないおまじないを増やさない)

Page 12: Kepler (scalamacros)について

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))) ... }

言語のおまじない

Page 13: Kepler (scalamacros)について

13

現状

“being specified and refined within a Scala improvement process (aka SIP #14).”

Page 14: Kepler (scalamacros)について

14

未完

Page 15: Kepler (scalamacros)について

End