我正在使用boo为我正在开发的可扩展纸牌游戏引擎创建一个DSL。
我有一个卡片宏,它为一种新的卡片类型创建一个类,并在构造函数中初始化一些属性。该宏有几个子宏,用于设置其他内容。基本上我想让它变成这样:
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来使card.Body宏在生成嵌套类的同时向构造函数添加代码。有什么想法吗?使用当前的语言功能可以做到这一点吗?
发布于 2009-07-17 10:14:22
这是可以做到的。下面是操作步骤:
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)()) |] 功劳归功于塞德里克·维维尔在boo Google group帮了我的忙。
https://stackoverflow.com/questions/1132149
复制相似问题