Takuya71 のぶろぐ

外資系ソフトウェア会社で働いてます、認定スクラムマスター

Scala Macro を試す - いまいちわかってない -

Scala Macro を試す

Scala 2.10 から Experimental ですが Macro 機能が入っていますが、
実際使ったことも無く どういうものか わかっていなかったので試してみました。

まず Scala 逆引レシピの付録の 2.10の新機能としても コンパイルの時間を表示するというサンプルが乗っていたので試してみたのですが、
逆引レシピが 2.10の正式版が出る前の頃の為か 2.10.2 でサンプルを実行しても動きませんでした。

公式のドキュメントを読んで試した結果以下のようなソースにすると動きました。

def compiledTime = macro compiledTime_impl
def compiledTime_impl(c: Context): c.Expr[String] = {
  import c.universe._
  val date = c.Expr[String](Literal(Constant(new java.util.Date().toString)))
  reify{"Compiled Date: " + date.splice}
}

マクロ内で束縛した値をマクロを適用するソースに渡す時には、
Literal(Constant(値))でtree を作り c.Expr[型](treeにした値) で抽象構文木にして
最後に reify で 変数には splice つけて渡すようです。 正直この 表現が適切ではないと思うのですが なんて書いていいかわからないところに
まだ マクロの理解が出来てないのが 見え見えとなっております。

参考