复杂的boo语法宏

5

我正在使用boo为可扩展的纸牌游戏引擎创建DSL。

我有一个卡牌宏,用于创建新类型的卡牌类,并在构造函数中初始化一些属性。该宏有一些子宏,用于设置其他内容。基本上,我希望它可以将以下内容转换为:

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,以使能力宏在生成嵌套类的同时添加代码到构造函数中。有什么想法吗?这可以使用当前语言功能完成吗?

1个回答

6

这是可以做到的。下面是具体方法:

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)()) |] 

感谢Cedric Vivier在boo Google组中帮助我解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接