2009-07-15 14 views
5

मैं बूओ के साथ काम कर रहे एक एक्स्टेंसिबल कार्ड गेम इंजन के लिए एक डीएसएल बना रहा हूं।मुश्किल बू सिंटेक्टिक मैक्रो

मेरे पास एक कार्ड मैक्रो है जो एक नए प्रकार के कार्ड के लिए कक्षा बनाता है, और कन्स्ट्रक्टर में कुछ गुणों को प्रारंभ करता है। उस मैक्रो में अन्य चीजों को स्थापित करने के लिए कुछ submacros है। मूल रूप से मैं यह कुछ इस तरह चालू करना चाहते हैं:

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 साथ क्या करना चाहिए जबकि यह भी एक नेस्टेड पैदा निर्माता करने की क्षमता मैक्रो ऐड कोड बनाने के लिए पता नहीं है कक्षा। कोई विचार? क्या यह वर्तमान भाषा क्षमताओं के साथ किया जा सकता है?

उत्तर

6

यह किया जा सकता है।

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

क्रेडिट boo Google group में मुझे बाहर की मदद करने के लिए सेड्रिक Vivier को जाता है: यहाँ कैसे।

संबंधित मुद्दे