很抱歉,这是一个基本问题,但是很难找到有关Maxima细节的过多讨论。
我正在尝试学习一些千里马,想使用类似的东西
x:2
x+=2
据我所知在Maxima中不存在。然后我发现可以将自己的运算符定义为中缀运算符,因此我尝试这样做
infix("+=");
"+=" (a,b):= a:(a+b);
但是这不起作用,就好像我先设置x:1
然后尝试调用x+=2
一样,该函数返回3,但是如果我检查x的值,我发现它没有改变。
有没有办法实现我在千里马想做的事情?谁能解释为什么我给的定义失败了?
谢谢!
答案 0 :(得分:2)
实施中的问题是评估过多和过少-+=
函数看不到符号x
,因此它不知道该为哪个变量分配变量。结果,并且未评估分配的左侧,因此+=
认为它是分配给a
,而不是x
。
这是获得正确评估数量的一种方法。 ::=
定义了一个宏,该宏只是一个引用其参数的函数,并且为其重新计算返回值。 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具有各种功能,即使您不需要使用它们,也可以使用函数式编程。