我创建了一个可扩展的卡牌游戏引擎我工作的一个DSL,用嘘声。

我有一个卡宏创建用于新的类型的卡类,并初始化在构造一些属性。该宏具有设置其他的东西几submacros。基本上我希望它变成是这样的:

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

幸得塞德里克·维威耶帮了我在的嘘声谷歌组

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top