Ваша проблема в том, что вы пытаетесь использовать значения для 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]
person
acer
schedule
07.04.2020