Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Kepler (scalamacros)について

1,639 views

Published on

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

Published in: Technology
  • Be the first to comment

Kepler (scalamacros)について

  1. 1. Keplerについて 小宮山 純平 (twitter@dekosuke)
  2. 2. はじめに マクロの話をします Project Kepler (ライブラリ、というより提案) の紹介をします 2
  3. 3. はじめにKeplerは提案なので現在ではなく未来の話です 3
  4. 4. コンパイル時メタプログラミング コードを生成してから、スカラのコンパイラが 実行される前に何かやりたいですよね 要するにマクロ(プリプロセッサ) Scalaにはコンパイラプラグインがあって、 scalacの各段階で処理が挟めます(scala- virtualizedとかは使ってるらしいです) Project Kepler (scalaへのmacroの提案) の話をし ましょう! 4
  5. 5. Project KeplerProject Kepler by Eugene Burmakohttp://scalamacros.org/Scalaにマクロを持ち込みたい! 5
  6. 6. マクロの悪名 C言語のマクロは悪名高い 6
  7. 7. マクロの悪名 C言語のマクロは悪名高い そもそもC++のテンプレートが提案された理由 はC言語マクロほど凶悪でないプリプロセッサ がほしからでした 7
  8. 8. Project KeplerのマクロC言語と違って Scalaそのもので書かれている(言語外の何かで はない) 式木の上での変換(生の文字列を操作したりし ない) Scalaの文法を変えない 8
  9. 9. Project Keplerのマクロマクロ(コンパイル時メタプロ)の利点として コード自動生成と違ってコード量が増えない 9
  10. 10. 例: 型安全なprintf (関数マクロ)//こんなマクロを書くと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) 10
  11. 11. 例:DB (型マクロ)macro trait MySqlDb(connString: String) = …type MyDb = Base withMySqlDb("Server=127.0.0.1;Database=Foo;") Scalaの文法の自然な拡張(意味のないおまじな いを増やさない) 11
  12. 12. Boilerplate 言語のおまじない 「すべてのBoilerplateを消し去りたい!」trait TupledFunctions extends Functions with TupleOps { implicit deffun[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 deffun[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))) ... } 12
  13. 13. 現状 “being specified and refined within a Scala improvement process (aka SIP #14).” 13
  14. 14. 未完 14
  15. 15. End

×