Я создаю 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, чтобы макрос способности добавлял код в конструктор, а также генерировал вложенный класс. Есть предположения? Можно ли это сделать с текущими языковыми возможностями?