2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

macro マクロとマクロクラス

Last updated at Posted at 2013-06-03

"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 マクロ内では難しい機能(外部クラスのメソッドを呼ぶ、等)を実装する場合。
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?