2014-07-22 99 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,解決者無論如何都必須遍歷列表中的所有元素來解決它們。我認爲限制因素將是你的名單的大小,而不是你爲每個限制的數量。 –