質問
私は 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グループ.
所属していません StackOverflow