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

Scalamacrosについて

on

  • 632 views

 

Statistics

Views

Total Views
632
Views on SlideShare
632
Embed Views
0

Actions

Likes
1
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Scalamacrosについて Scalamacrosについて Presentation Transcript

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