読者です 読者をやめる 読者になる 読者になる

yoskhdia’s diary

DDDとかプログラミングとかアーキテクチャとか雑多に

Scalaマクロへの誘いTweetまとめと補足

Scala

Scala 2.11時点でマクロはexperimentalな機能です。 将来のバージョンでは変わる可能性がある点にご注意ください。 将来的には scala.meta というプロジェクトに移るようです。 公開されているスライドを見ると、今のマクロ記述から新しい記述へはこう変わるという点が示されています。

と呟いたように、リフレクションをまず学ぶのが遠そうで実は近道だと思います。 Scalaのリフレクションもまだ改善の余地がある気がするのですが、scala.metaが出るともっと良くなるのでしょうか? Javaのリフレクションとは異なり、Scalaはコンパニオンオブジェクトやトレイトなどコンパイル時に解決されるものがあるため、Javaの感覚で理解しないままClassオブジェクトを使うのは危険らしいです。

他にはimplicitマクロや抽出子マクロがあるようですが、defマクロが一番基本だと思います。 implicitマクロはまだ使う機会がありそうかなと思えますが、ライブラリならともかくプロダクションコードでimplicitを多用するのも...という論もあり、implicit + macroの組み合わせはデバッグがしづらくなるデメリットの方が大きいんじゃないかなというところです。

展開するコードを書く場面では準クォートがあるので良いのですが、受け取ったTreeを分解する過程ではどんなオブジェクトがあるかを知らないと分解のしようがないので、準クォートの前にオブジェクトを学んでおいた方が良いです。 分解の仕方を知っておくと、例えば引数で渡される式を分解しながら、途中に特定のメソッドが呼ばれているかを判定するなどができるようになります。 (こういった使い方をするには、ユースケースを限定しないと複雑度が上がってしまうので難しいところですが...)

scala.metaになったら手を入れなきゃいけなくなりそうな雰囲気がありますので、マクロを使いたいならしっかりテストを書いておくことをオススメします。

補足

※補足4は間違って抜かしてしまっただけです。
Twitterのツイートをembedすると連ツイだと見難いですね...。