私が取り組んでいる拡張可能なカードゲームエンジン用の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で何をすべきかわかりません。ネストされたクラスを生成しながら、能力マクロにコンストラクターにコードを追加させるためのボディ。何かご意見は?これは現在の言語機能で実行できますか?