Macros 困难的boo语法宏

Macros 困难的boo语法宏,macros,boo,Macros,Boo,我正在用boo为我正在开发的可扩展纸牌游戏引擎创建一个DSL 我有一个card宏,它为一种新类型的卡创建一个类,并初始化构造函数中的一些属性。该宏有几个用于设置其他内容的子宏。基本上我想让它变成这样: card 'A new card': type TypeA ability EffectA: // effect definition 为此: class ANewCard (Card): def constructor(): Name =

我正在用boo为我正在开发的可扩展纸牌游戏引擎创建一个DSL

我有一个card宏,它为一种新类型的卡创建一个类,并初始化构造函数中的一些属性。该宏有几个用于设置其他内容的子宏。基本上我想让它变成这样:

card 'A new card':
    type TypeA
    ability EffectA:
        // effect definition
为此:

class ANewCard (Card):
    def constructor():
        Name = "A new card"
        Type = Types.TypeA
        AddEffect(EffectA())

    class EffectA (Effect):
        // effectdefintion
效果肯定需要是一个类,因为它将被传递(这是一种策略模式)

到目前为止,我有一个简单的框架:

macro card:
    yield [|
        class $(ReferenceExpression(card.Arguments[0])) (Card):
            def constructor():
                Name = $(card.Arguments[0])
    |]

现在,我不知道应该如何处理card.Body,使该能力宏在生成嵌套类的同时向构造函数添加代码。有什么想法吗?使用当前的语言功能可以做到这一点吗?

可以做到。以下是方法:

import Boo.Lang.Compiler.Ast 
import Boo.Lang.PatternMatching 

macro card(name as string): 
    klass = [| 
        class $(ReferenceExpression(name)): 
            def constructor(): 
                Name = $name
    |] 
    klass.Members.Add(card["effect"]) 
    klass.GetConstructor(0).Body.Add(card["effect-ctor"] as Expression) 
    yield klass 

macro effect(eff as ReferenceExpression): 
    card["effect"] = [| 
        class $eff (Effect): 
            pass 
    |] 
    card["effect-ctor"] = [| Effects.Add($(eff)()) |] 
塞德里克·维维尔在这场比赛中帮助了我,这要归功于他