Труден бу синтактичен макрос

Създавам DSL за разширим двигател за игра на карти, върху който работя, с boo.

Имам макрос за карта, който създава клас за нов тип карта и инициализира някои свойства в конструктора. Този макрос има няколко подмакроса за настройка на други неща. По принцип искам да стане нещо подобно:

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, за да накарам макроса за способности да добави код към конструктора, като същевременно генерира вложен клас. някакви мисли? Може ли това да се направи с текущите езикови възможности?


person R. Martinho Fernandes    schedule 15.07.2009    source източник


Отговори (1)


Може да се направи. Ето как:

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

Заслугата е на Седрик Вивие, че ми помогна в буу група в Google.

person R. Martinho Fernandes    schedule 17.07.2009