首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写生成列表项的宏

如何编写生成列表项的宏
EN

Stack Overflow用户
提问于 2014-07-22 22:36:42
回答 2查看 141关注 0票数 0

我有一个结构体的列表,这个结构体有一个定义它的类型的字段(假设它的名字)。我希望有一个宏,如下所示:

代码语言:javascript
复制
MYKEEP <name>.<field> <ANY KEEP>;

它将被翻译为:

代码语言:javascript
复制
keep value(mylist.has(it.name == <name>)) => mylist.first(it.name == <name>).<field> <ANY KEEP>

有没有可能在没有“按计算”宏的情况下做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2014-07-23 15:16:29

看起来您想要获取一个结构列表作为输入,检查一些结构字段的值,然后根据该值将一个常量值分配给不同的结构字段。

考虑到性能,两个字段之间的这种“内射”关系应该是过程性代码而不是生成性的。(很可能在post_generate()中)。

考虑使用如下所示的define as宏:

代码语言:javascript
复制
 define <name_induced_field'struct_member>  "MYKEEP <name'exp> <field'exp> <ANY_KEEP'exp>" as{

post_generate() is also{
    for each in l{
        if (it.t==<name'exp>){
            it.<field'exp> = <ANY_KEEP'exp>;
        };
    };

};
};

然后像这样在代码中使用它:

代码语言:javascript
复制
type mytype: [AA,BB];

struct s {

t:mytype;
!i:int;

};

extend sys{

MYKEEP AA i 1;
MYKEEP BB i 2;

l:list of s;
keep l.size()==5;
};

注意:如果结构字段在其他情况下与其名称具有相同的关系,请考虑从结构中约束该字段,例如:

代码语言:javascript
复制
 define <name_induced_field'struct_member>  "MYKEEP <name'exp> <field'exp> <ANY_KEEP'exp>" as{
keep value(t==<name'exp>) => (<field'exp>==<ANY_KEEP'exp>);
};

type mytype: [AA,BB];

struct s {

MYKEEP AA i 1;
MYKEEP BB i 2;

t:mytype;
i:int;

post_generate() is also{
print me;
};
};
票数 0
EN

Stack Overflow用户

发布于 2014-07-23 15:42:17

代码语言:javascript
复制
define <ana_packet_gen_con_keep1'exp>   "KEEP_CON [(<WORD>soft) ]<type'exp>\.<field'any> <exp>" as {
    keep for each (con) in it.containers {
        <WORD> (con.con_type==<type'exp>) => con.as_a(<type'exp>'con_type ana_container).<field'any> <exp>;
    };
};

有几个"keep for each“对性能的影响太大了吗?

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

https://stackoverflow.com/questions/24890311

复制
相关文章

相似问题

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