質問

私は 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

エフェクトは受け渡されるため、必ずクラスである必要があります (これは Strategy パターンです)。

これまでのところ、次のような単純なスケルトンができています。

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

私を助けてくれたセドリック・ヴィヴィエの功績です。 ブーGoogleグループ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top