0

有没有办法可以扩展 e 中列表的给定伪方法,以添加一些特定的实现?

谢谢

4

3 回答 3

3

“伪方法”并不是真正的方法,它只是看起来好像是。所以不能用“is also/only/etc”扩展。

但是您可以使用宏定义自己的任何“伪方法”。

例如 - 只添加偶数项的伪方法 - (请注意 () 之前的 \ )

define <my_pseudo_method'action> "<input1'exp>.add_if_even\(<input2'num>\)" 
      as computed  {
result = append("if ", <input2'num>, " %2 == 0 then { ",   <input1'exp>, ".add(", <input2'num>, ")};");
}

然后可以从另一个文件中调用 -

extend sys {
    run() is also {
        var my_list : list of int;
        for i from 0 to 10 {
            my_list.add_if_even(i);
        };
        print my_list;
    };
};
于 2014-04-09T13:11:20.817 回答
1

使用宏,您甚至可以“覆盖”现有的伪方法。例如,假设您要修改 add() 以便仅当它不在列表中时才会将元素添加到列表中。(换句话说,您希望使列表中的所有元素保持唯一)。你可以这样做:

define <my_add'action> "<list'exp>.add\(<exp>\)" as {
    if not <list'exp>.has(it == <exp>) then {
        var new_size<?>: int = <list'exp>.size() + 1;
        <list'exp>.resize(new_size<?>, TRUE, <exp>, TRUE);
    };
};

请注意,我在这里使用了另一个伪方法——resize()——来实现将新元素实际添加到列表中。如果我尝试使用 add() 伪方法本身,它将不起作用,并会导致无限递归。这是因为宏内部使用的 add() 将再次调用宏本身,而不是覆盖预定义的伪方法。

于 2014-04-10T09:06:17.693 回答
1

您还可以使用模板来添加/修改列表伪方法。例如

<'
template struct MyList of (<T1'type>) {
   items: list of <T1'type>;
   keep soft items.size()==10;
   pop_index(i:int):<T1'type> is {
      result = items[i];
      items.delete(i);     
   };
};
extend sys {
   list1: MyList of (byte);
   // somehwere
   var foo:= list1.pop_index(3);
};
'>
于 2014-04-10T14:05:12.420 回答