我正在为一个我正在研究的可扩展卡片游戏引擎创建一个DSL,用boo.
我有一个卡宏,它为新类型的卡创建一个类,并在构造函数中初始化一些属性.该宏有一些用于设置其他内容的子宏.基本上我想让它变成这样的东西:
card 'A new card':
type TypeA
ability EffectA:
// effect definition
Run Code Online (Sandbox Code Playgroud)
进入这个:
class ANewCard (Card):
def constructor():
Name = "A new card"
Type = Types.TypeA
AddEffect(EffectA())
class EffectA (Effect):
// effectdefintion
Run Code Online (Sandbox Code Playgroud)
效果肯定需要是一个类,因为它将被传递(它是一个战略模式).
到目前为止,我有这个简单的骨架:
macro card:
yield [|
class $(ReferenceExpression(card.Arguments[0])) (Card):
def constructor():
Name = $(card.Arguments[0])
|]
Run Code Online (Sandbox Code Playgroud)
现在,我不知道我应该怎么做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)()) |]
Run Code Online (Sandbox Code Playgroud)
感谢Cedric Vivier帮助我进入嘘声Google小组.