题
我创建了一个可扩展的卡牌游戏引擎我工作的一个DSL,用嘘声。
我有一个卡宏创建用于新的类型的卡类,并初始化在构造一些属性。该宏具有设置其他的东西几submacros。基本上我希望它变成是这样的:
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)()) |]
幸得塞德里克·维威耶帮了我在的嘘声谷歌组。
不隶属于 StackOverflow