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.

Scalamacrosについて

755 views

Published on

Published in: Technology
  • Be the first to comment

Scalamacrosについて

  1. 1. Scalamacrosについて @dekosuke
  2. 2. 自己紹介 twitter@dekosuke Webエンジニア@D社 機械学習とHaskell 2
  3. 3. はじめに マクロの話をします Scalamacros(ライブラリ、というより提案)の 紹介をします 3
  4. 4. はじめにScalamacrosは提案なので現在ではなく未来の話です 4
  5. 5. コンパイル時メタプログラミング スカラのコンパイラが実行される前に何かやり たいですよね 要するにマクロ(プリプロセッサ) Scalaにはコンパイラプラグインがあって、 scalacの各段階で処理が挟めます(scala- virtualizedとかは使ってるらしいです) Scalamacrosの話をしましょう! 5
  6. 6. ScalamacrosScalamacros (Project Kepler) by Eugene Burmakohttp://scalamacros.org/Scalaにマクロを持ち込みたい! 6
  7. 7. マクロの悪名 C言語のマクロは悪名高い 7
  8. 8. マクロの悪名 C言語のマクロは悪名高い そもそもC++のテンプレートが提案された理由 はC言語マクロほど凶悪でないプリプロセッサ がほしからでした 8
  9. 9. Project KeplerのマクロC言語と違って Scalaそのもので書かれている(言語外の何かで はない) 式木の上での変換(生の文字列を操作したりし ない) Scalaの文法を変えない 9
  10. 10. Project Keplerのマクロ(マクロの利点として)コード自動生成と違ってコード量が増えない 10
  11. 11. 例: 型安全な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) 11
  12. 12. 例:DB (型マクロ)macro trait MySqlDb(connString: String) = …type MyDb = Base withMySqlDb("Server=127.0.0.1;Database=Foo;") Scalaの文法の自然な拡張(意味のないおまじな いを増やさない) 12
  13. 13. 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))) ... } 13
  14. 14. 現状 “being specified and refined within a Scala improvement process (aka SIP #14).” 14
  15. 15. End
  16. 16. 作者HP 作者HP見ると時系列的な進行が分かるよ! http://xeno-by.blogspot.com/ 16

×