Schwierige boo syntaktische Makro
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?
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 .