Your SlideShare is downloading. ×
Scalamacrosについて
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Scalamacrosについて

495

Published on

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

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

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×