我有一個結構體列表,結構體有一個定義它的類型的字段(假設它是名字)。 我想有一個宏如下:如何寫一個宏來生成列表項
MYKEEP <name>.<field> <ANY KEEP>;
這將被轉換爲:
keep value(mylist.has(it.name == <name>)) => mylist.first(it.name == <name>).<field> <ANY KEEP>
是否有可能做到這一點沒有「作爲計算」宏?
我有一個結構體列表,結構體有一個定義它的類型的字段(假設它是名字)。 我想有一個宏如下:如何寫一個宏來生成列表項
MYKEEP <name>.<field> <ANY KEEP>;
這將被轉換爲:
keep value(mylist.has(it.name == <name>)) => mylist.first(it.name == <name>).<field> <ANY KEEP>
是否有可能做到這一點沒有「作爲計算」宏?
它看起來像你想獲得結構的列表作爲輸入,檢查一些 結構的字段的值,然後根據該值的恆定值分配給不同的結構領域 。
考慮到性能,兩種領域之間的這種'內射'關係應該是處理代碼而不是生成的。 (很可能在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;
};
};
程序代碼不能幫助我,因爲這些字段可能會影響其他人在生成時間。 我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>;
};
};
請問有幾個「保持每個」影響性能太多了?
這是不是比你想要的問題略有不同?這不會限制你的名單有一個'
沒關係,這個約束更「通用」,我可以修改它來接收「結構」數字。 –
不知道'for each',但是IMO,解決者無論如何都必須遍歷列表中的所有元素來解決它們。我認爲限制因素將是你的名單的大小,而不是你爲每個限制的數量。 –
真的不明白你在這裏限制什麼。 'mylist.has(it.name ==)'會返回一個布爾值,對此您無法解除引用任何''。 –
對不起,打算寫第一個,沒有 –
所以基本上你想知道你是否可以簡化約束,對不對? –