有没有办法可以扩展 e 中列表的给定伪方法,以添加一些特定的实现?
谢谢
“伪方法”并不是真正的方法,它只是看起来好像是。所以不能用“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;
};
};
使用宏,您甚至可以“覆盖”现有的伪方法。例如,假设您要修改 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() 将再次调用宏本身,而不是覆盖预定义的伪方法。
您还可以使用模板来添加/修改列表伪方法。例如
<'
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);
};
'>