Сложный синтаксический макрос boo
Вопрос
Я создаю 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, чтобы макрос способности добавлял код в конструктор, одновременно генерируя вложенный класс.Есть предположения?Можно ли это сделать с нынешними языковыми возможностями?
Решение
Это может быть сделано.Вот как:
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)()) |]
Благодарим Седрика Вивье за помощь мне в фу группа гугла.