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

时间:2019-04-25 22:39:15

标签: function maxima

很抱歉,这是一个基本问题,但是很难找到有关Maxima细节的过多讨论。

我正在尝试学习一些千里马,想使用类似的东西

x:2
x+=2
据我所知

在Maxima中不存在。然后我发现可以将自己的运算符定义为中缀运算符,因此我尝试这样做

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

但是这不起作用,就好像我先设置x:1然后尝试调用x+=2一样,该函数返回3,但是如果我检查x的值,我发现它没有改变。

有没有办法实现我在千里马想做的事情?谁能解释为什么我给的定义失败了?

谢谢!

1 个答案:

答案 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具有各种功能,即使您不需要使用它们,也可以使用函数式编程。