2009-07-15 64 views
5

我正在创建一个扩展卡游戏引擎的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使能力宏代码添加到构造函数,同时还产生一个嵌套类。有什么想法吗?这可以用当前的语言功能来完成吗?

回答

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

幸得塞德里克·维威耶帮了我的boo Google group