سؤال

أنا أقوم بإنشاء 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)()) |] 

الائتمان يذهب إلى سيدريك فيفير لمساعدتي في بو جوجل جروب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top