2009-07-15 20 views
5

Genişletilebilir kart oyun motoru için bir DSL yaratıyorum, boo ile çalışıyorum.Zor boo sözdizimi makro

Yeni bir kart türü için sınıf oluşturan bir kart makrosu var ve kurucudaki bazı özellikleri başlatıyor. Bu makronun başka şeyleri ayarlamak için birkaç altmacısı var. Temelde ben böyle bir şey açmak istiyorum: bu işe

card 'A new card': 
    type TypeA 
    ability EffectA: 
     // effect definition 

: (It is a Strateji desen var) etrafında geçilecek çünkü

class ANewCard (Card): 
    def constructor(): 
     Name = "A new card" 
     Type = Types.TypeA 
     AddEffect(EffectA()) 

    class EffectA (Effect): 
     // effectdefintion 

etkisi kesinlikle bir sınıf olması gerekir.

Şimdiye kadar, bu basit iskeleti vardır: Şimdi

macro card: 
    yield [| 
     class $(ReferenceExpression(card.Arguments[0])) (Card): 
      def constructor(): 
       Name = $(card.Arguments[0]) 
    |] 

, ben de yuvalanmış oluşturulurken ben card.Body yapmalıyım yapıcı yeteneği makro eklenti kodunu yapmak için bilmiyorum sınıf. Düşüncesi olan var mı? Bu mevcut dil yetenekleri ile yapılabilir mi?

cevap

6

Bu yapılabilir.

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

Kredi boo Google group yılında yardımın için Cedric Vivier gider: İşte nasıl.