我想在函数定义中使用索引变量(这是MWE,在现实世界中,我有很多a[i]
用作多项式的系数)
f(x):=a[0]*x $
但是当我评估此函数为a[0]
分配一个值时,该分配将被忽略:
ev(f(z),[a[0]=99]);
> a[0]*z
为了获得期望的结果,我需要进行其他分配
expr:f(z) $
ev(expr,[a[0]=99]);
> 99*z
这是怎么回事?有没有办法避免额外的步骤?
预先感谢您提供任何线索。
答案 0 :(得分:1)
我看到,如果您先将函数编写为f(x) := a0*x
,然后再编写ev(f(z), a0=99)
,则会得到预期的结果99*z
。因此,f(x) := a[0]*x
的不同行为是一个错误。我将提交错误报告。
通常,将占位符替换为值的更可预测的策略是使用subst
函数,该函数将值替换为表达式。在这种情况下,您可以这样写:
subst (a[0] = 99, f(z));
如果您要替换多个值,则可以编写:
subst ([a[0] = 99, a[1] = 42, a[2] = 2*foo], myexpr);
其中myexpr
是一个包含a[0]
,a[1]
和a[2]
的表达式。
subst
是连续的(一次一个值)替换。另请参见psubst
,它是并行替换(一次所有值)。