سؤال
أنا أقوم بإنشاء 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])
|]
الآن، لا أعرف ماذا أفعل مع البطاقة .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)()) |]
الائتمان يذهب إلى سيدريك فيفير لمساعدتي في بو جوجل جروب.
لا تنتمي إلى StackOverflow