なんかわかりづらいですが、つまり以下のコードを実行すると
val foo, bar, baz = const
println(foo)
println(bar)
println(baz)
順に foo, bar, baz が表示されます。正確にはコンパイラ内部のAPIにアクセスしてるので、単なるマクロというより、コンパイラプラグインに近い気がします。
以下のような経緯で、ほとんど sbt の実装を持ってきただけですが、シンプルに必要な部分だけ取り出して、独立したsbtのプロジェクトの形にして、githubにリポジトリ作っておきました
https://github.com/xuwei-k/const
さっきのsbt0.13のやつ enclosingValName URL ってあるから、まさかと思って試してみたら、予想以上というか予想通りというか。すごい、マクロでこんなことできるのかキモいURL
2013-01-11 22:43:50 via web
さっきのマクロの原理使えば、「Stringリテラルを複数箇所で書きたくないためだけに、valに束縛してる」以下のようなパターンをval foo="foo";val bar="bar";変数名自体をStringで返すだけのマクロつくって使えば、DRYに書くとかできそう
2013-01-11 22:53:19 via web
さっきの嘘ついたっぽい(´・ω・`)マクロの実装自体は、コンパイラにも依存してるから、マクロだけであれはできないっぽい URL
2013-01-11 23:23:45 via web
この URL reflect.macros.runtime.Contextというのが、コンパイラ内部のclass URL
2013-01-11 23:24:36 via web
キャストしてコンパイラ内部の reflect.macros.runtime.Context にするって、やりすぎ感あるというかなんというか。でも、「ユーザー側からは単なるマクロに見せかけておいて、実際はコンパイラ内部のAPIも使う」には、こうするしかないか・・・
2013-01-11 23:59:28 via web