2014-07-22 40 views
0

我有一个结构体列表,结构体有一个定义它的类型的字段(假设它是名字)。 我想有一个宏如下:如何写一个宏来生成列表项

MYKEEP <name>.<field> <ANY KEEP>; 

这将被转换为:

keep value(mylist.has(it.name == <name>)) => mylist.first(it.name == <name>).<field> <ANY KEEP> 

是否有可能做到这一点没有“作为计算”宏?

+0

真的不明白你在这里限制什么。 'mylist.has(it.name == )'会返回一个布尔值,对此您无法解除引用任何''。 –

+0

对不起,打算写第一个,没有 –

+0

所以基本上你想知道你是否可以简化约束,对不对? –

回答

0

它看起来像你想获得结构的列表作为输入,检查一些 结构的字段的值,然后根据该值的恒定值分配给不同的结构领域 。

考虑到性能,两种领域之间的这种'内射'关系应该是处理代码而不是生成的。 (很可能在post_generate())中。

考虑使用定义为宏,看起来像这样:

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>; 
     }; 
    }; 

}; 
}; 

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

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; 
}; 

注意:如果该结构域具有相同的关系它的名称在其他情况下,请考虑 可能会限制结构中的字段,例如:

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

程序代码不能帮助我,因为这些字段可能会影响其他人在生成时间。 我manged地发现,似乎工作的宏:

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>; 
    }; 
}; 

请问有几个“保持每个”影响性能太多了?

+0

这是不是比你想要的问题略有不同?这不会限制你的名单有一个''类型的项目,或?此外,它限制了所有类型的项目,而不仅仅是第一个项目。 –

+0

没关系,这个约束更“通用”,我可以修改它来接收“结构”数字。 –

+0

不知道'for each',但是IMO,解决者无论如何都必须遍历列表中的所有元素来解决它们。我认为限制因素将是你的名单的大小,而不是你为每个限制的数量。 –