"macro" は、実は MacroMacro という名前の「Boo マクロ」です。Boo 処理系は「Macro」で終わる名前のクラスを「マクロ」とみなすようになっていて、"macro" はそれを使って実装されています。
- Booソースの、 src/Boo.Lang.Extensions/Macros/MacroMacro.boo が "macro" の実装です。
次の macro を使った例は、macro を使わずに書けます。
# qiita で booってタグがえらべるようになったよ!
macro hello:
return [|
print "hello"
|]
hello # print "hello" に置き換わる
macro を使わないなら次のようになります。
import Boo.Lang.Compiler
import Boo.Lang.Compiler.Ast
# Macro で終わる名前のクラスはその前のHelloという名前のマクロ定義となります。
class HelloMacro( AbstractAstMacro ):
def Expand( mc as MacroStatement ) as Statement:
return [|
print "hello"
|]
hello
よって、正しく表現するなら、macro の方は「macro マクロ」と呼ぶ方が良いように思います。
通常使う分には macro マクロの方が次の点で便利です。
- class定義とか、継承元(AbstractAstMacro以外にもイロイロ選択肢がある)選択とかしなくていい。
- パターンマッチングが使いやすい。macroマクロの場合、match .. と書かずにいきなり case [|...|] と書ける。
- ネストしたマクロも書きやすい。子供マクロも macro で定義してちゃんと動作する(class ...Macro だと、内部でまた class ... と書かなければならない)。
macro マクロで不便になるのは次の場合なので、こういった時だけ class ..Macro(...): と直接 class を使って定義します。
- 他のマクロクラスを継承して使いたい(マクロ自体の機能拡張)。macro マクロは継承元を選択できない。
- いくつかのマクロで実装を共有したい。共有したいメソッド等を含むクラスを用意して、各マクロクラスで継承するなりcompositeするなり。
- その他、macro マクロ内では難しい機能(外部クラスのメソッドを呼ぶ、等)を実装する場合。