首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >难解的boo语法宏

难解的boo语法宏
EN

Stack Overflow用户
提问于 2009-07-15 15:30:05
回答 1查看 1K关注 0票数 5

我正在使用boo为我正在开发的可扩展纸牌游戏引擎创建一个DSL。

我有一个卡片宏,它为一种新的卡片类型创建一个类,并在构造函数中初始化一些属性。该宏有几个子宏,用于设置其他内容。基本上我想让它变成这样:

代码语言:javascript
复制
card 'A new card':
    type TypeA
    ability EffectA:
        // effect definition

如下所示:

代码语言:javascript
复制
class ANewCard (Card):
    def constructor():
        Name = "A new card"
        Type = Types.TypeA
        AddEffect(EffectA())

    class EffectA (Effect):
        // effectdefintion

效果肯定需要是一个类,因为它将被传递(它是一个策略模式)。

到目前为止,我有一个简单的框架:

代码语言:javascript
复制
macro card:
    yield [|
        class $(ReferenceExpression(card.Arguments[0])) (Card):
            def constructor():
                Name = $(card.Arguments[0])
    |]

现在,我不知道应该如何使用card.Body来使card.Body宏在生成嵌套类的同时向构造函数添加代码。有什么想法吗?使用当前的语言功能可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-17 10:14:22

这是可以做到的。下面是操作步骤:

代码语言:javascript
复制
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帮了我的忙。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1132149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档