Scalamacrosについて

607
-1

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
607
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

×