"新しい"というのは、Scala2.11のことではないです。知らないうちにすごいものが始まっていたようです。
https://github.com/scalareflect
https://groups.google.com/d/topic/palladium-internals/BtWfykLO0HQ/discussion
いっぱいプロジェクトあって、ドキュメントやREADMEを流し読んでみましたが、わからなことだらけです。
で、とりあえずなんとなく理解できた部分だけを勝手に解説します。
とりあえず、先日行われたnescala2014でのスライドより
http://scalamacros.org/paperstalks/2014-03-02-RethinkingScalaMacros.pdf
「マクロって使う側は便利だけど、マクロを書く側は大変だよね」という話の流れで、以下の様なコードが登場します。Listなどのmapを、whileにインライン展開する例みたいです。
implicit class Mapper[Coll[_], A](coll: Coll[A]) { macro map[B](fn: A => B): Coll[B] = { val q"(..$ps) => $body" = fn val newBuilder = t"Coll".companion.method("newBuilder") q""" def fn(..$ps) = $body val buf = $newBuilder[$A] var i = 0 while (i < coll.length) { buf += fn(coll(i)); i += 1 } buf.result """ } }
このコードのポイントは、
- マクロの定義と実装分ける必要ない!
- ContextとかExprとかWeakTypeTagとかでてこない!
- つまり覚えるべきクラスが減り、なんとなくquasiquoteだけ書けばよい?
- TypeRefとかいらなくて、$Aで型パラメータまで参照できる!?
- その他色々(よく理解できませんでした)
え、何言ってるの!?そんなこと可能なの!?というくらい、今までのマクロより格段に進化してますよね?ただ、作り始めたばかりな感じでしょうか?(まだコードよく読んでないので不明)
あと、今回紹介したのはごく一部で、他にも色々あるみたいです。
勝手な予想としては
- 2.10や2.11のマクロやリフレクションは、experimentalのまま、Palladiumが完成したらPalladiumで置き換わるのだろうか
- それとも段階的にScala本体に取り込まれるのか
- それとも、Palladiumもまた単なる実験で終わるのか
などのパターンが考えられますが、今後どうなるのか・・・