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

问题描述 投票:1回答:1

对不起基本问题,但很难找到关于Maxima细节的太多讨论。

我正在尝试学习一些Maxima,并希望使用类似的东西

x:2
x+=2

据我所知,千里马不存在。然后我发现我可以将自己的运算符定义为中缀运算符,所以我尝试了

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

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

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

谢谢!

function maxima
1个回答
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具有各种功能,可以使用函数式编程,但您不需要使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.