我可以定义一个最大值函数 f(x) 来赋值给参数 x

Can I define a maxima function f(x) which assigns to the argument x

抱歉这个基本问题,但很难找到太多关于 Maxima 细节的讨论。

我正在尝试学习一些 Maxima 并想使用类似

的东西
x:2
x+=2

据我所知,Maxima 中不存在。然后我发现我可以将我自己的操作符定义为中缀操作符,所以我尝试做

infix("+=");
"+=" (a,b):= a:(a+b);

但是这不起作用,就好像我先设置 x:1 然后尝试调用 x+=2,函数 returns 3,但是如果我检查 x 的值,我会看到它没有改变。

有没有办法实现我在 Maxima 中尝试做的事情?谁能解释一下为什么我给出的定义失败了?

谢谢!

您的实现的问题是求值太多和太少——+= 函数看不到符号 x,所以它不知道要传递给哪个变量分配结果,并且不评估分配的左侧,因此 += 认为它正在分配给 a,而不是 x.

这是获得适当评价量的一种方法。 ::= 定义了一个宏,它只是一个引用其参数的函数,并再次计算 return 值。 buildq 是一个替换函数,它引用要替换的表达式。所以这里结合::=buildq就是构造x: x + 2表达式,然后求值

(%i1) infix ("+=") $
(%i2) "+="(a, b) ::= buildq ([a, b], a: a + b) $
(%i3) x: 100 $
(%i4) macroexpand (x += 1);
(%o4)                       x : x + 1
(%i5) x += 1;
(%o5)                          101
(%i6) x;
(%o6)                          101
(%i7) x += 1;
(%o7)                          102
(%i8) x;
(%o8)                          102

因此,如果您愿意,当然可以这样做。但我可以建议你不需要它吗?修改一个变量使得在精神上更难跟踪正在发生的事情。诸如一次性分配之类的编程策略可以使程序员更容易理解程序。这是称为函数式编程的通用方法的一部分;也许你可以看看那个。 Maxima 具有多种功能,可以使用函数式编程,但您并非必须使用它们。