2009-07-15 5 views
5

私は仕事をしている拡張可能なカードゲームエンジン用のDSLを作成しています。難しい文法的なマクロ

私は新しいタイプのカード用のクラスを作成し、コンストラクタのいくつかのプロパティを初期化するカードマクロを持っています。そのマクロには他のものを設定するためのサブマクロがいくつかあります。基本的に私はそれがこのような何かを有効にする:この中

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

:それは(それがStrategyパターンです)周りに渡されますので、

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で私を助けるためセドリックヴィヴィエに行く:ここでは方法です。

関連する問題