对不起基本问题,但很难找到关于Maxima细节的太多讨论。
我正在尝试学习一些Maxima,并希望使用类似的东西
x:2
x+=2
据我所知,千里马不存在。然后我发现我可以将自己的运算符定义为中缀运算符,所以我尝试了
infix("+=");
"+=" (a,b):= a:(a+b);
但是这不起作用,好像我先设置x:1
然后尝试调用x+=2
,函数返回3,但如果我检查x的值,我看到它没有改变。
有没有办法实现我在千里马尝试做的事情?谁能解释为什么我给出的定义失败了?
谢谢!
你的实现的问题是评估太多而且太少 - +=
函数没有看到符号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具有各种功能,可以使用函数式编程,但您不需要使用它们。