Frage

Ich bin ein DSL für ein erweiterbares Kartenspiel-Engine zu schaffen arbeite ich an, mit boo.

Ich habe eine Karte Makro, die eine Klasse für eine neue Art der Karte erstellt und initialisiert einige Eigenschaften im Konstruktor. Das Makro hat ein paar submacros für andere Dinge einstellen. Im Grunde möchte ich es so etwas drehen:

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

in diesen:

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

    class EffectA (Effect):
        // effectdefintion

Der Effekt auf jeden Fall muss eine Klasse sein, weil sie herumgereicht werden (es ist ein Strategie-Muster).

Bisher habe ich diese einfache Skelett:

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

Nun, ich weiß nicht, was soll ich mit card.Body tun die Fähigkeit Makro hinzufügen Code an den Konstruktor zu machen, während auch eine verschachtelte Klasse zu erzeugen. Irgendwelche Gedanken? Kann dies mit aktuellen Sprachfähigkeiten zu tun?

War es hilfreich?

Lösung

Es kann getan werden. Hier ist, wie:

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

Kredit geht an Cedric Vivier mich für die Unterstützung aus der boo Google Gruppe .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top