Scalaの新しいリフレクションとマクロ、Palladiumとは?

"新しい"というのは、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もまた単なる実験で終わるのか

などのパターンが考えられますが、今後どうなるのか・・・