[英]Difficult boo syntactic macro
我正在使用boo为正在使用的可扩展纸牌游戏引擎创建DSL。
我有一个card宏,它为一种新型的card创建一个类,并在构造函数中初始化一些属性。 该宏具有一些用于设置其他内容的子宏。 基本上我希望它变成这样的东西:
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)()) |]
感谢Cedric Vivier协助我加入Google boo小组 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.