您的问题是您试图在过程主体的构造中使用a的值,而不是“表达式的RHS”正如你所说。
尽量不要在这种情况下使用“函数”一词,因为它只会混淆表达式和过程之间的区别。
这是一种从ix 获取值的方法,以替换生成的过程列表中的a,正文中带有(x-a)^2。
restart;
ix := [-1,0,1]:
b := []:
for a in ix do
b := [op(b), unapply((x-a)^2,x)];
end do:
b;
[x -> (x+1)^2, x -> x^2, x -> (x-1)^2]
以这种方式构造列表是低效的,通过重复连接它们。由于该练习在性能上的扩展性很差,因此您真的应该放弃它作为一种练习。
您可以通过调用seq 来构建整个列表。
Flist := [ seq( unapply((x-a)^2,x), a in ix ) ]:
Flist;
[x -> (x+1)^2, x -> x^2, x -> (x-1)^2]
这里,Flist 是一个过程列表,每个过程都可以通过使用参数调用它来计算一个值。
Flist[1];
x -> (x+1)^2
Flist[3](3.4);
5.76
#plot(Flist, -2..2);
注意:以箭头符号x -> ... 显示的过程称为操作符。
为了好玩,这里有等价物,使用表达式,
Elist := [ seq( (x-a)^2, a in ix ) ]:
Elist;
[ 2 2 2]
[(x + 1) , x , (x - 1) ]
Elist[1];
2
(x + 1)
eval(Elist[3], x=3.4);
5.76
#plot(Elist, x=-2..2);
还有其他方法可以生成过程,以编程方式指定正文中的 a 值。 unapply 命令不是唯一可能的机制,尽管它对您的示例来说是最简单的。
另一种方法是替换,例如,
generic := x -> (x-_dummy)^2:
Hlist := [ seq( subs(_dummy=a, eval(generic)), a in ix ) ]:
Hlist;
[x -> (x+1)^2, x -> x^2, x -> (x-1)^2]