похоже, вы хотите получить список структур в качестве входных данных, проверить значение некоторых полей структуры, а затем присвоить постоянное значение другому полю структуры в соответствии с этим значением.
принимая во внимание производительность, такого рода «инъективные» отношения между двумя полями должны быть в процедурном коде, а не в генеративном. (скорее всего, в 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;
};
};
person
yuvalg
schedule
23.07.2014
mylist.has(it.name == <name>)
вернет логическое значение, для которого вы не можете разыменовывать<field>
. - person Tudor Timi   schedule 22.07.2014define as computed
, а обычный макросdefine as
. - person Tudor Timi   schedule 23.07.2014