我可以定义一个最大值函数 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 具有多种功能,可以使用函数式编程,但您并非必须使用它们。
抱歉这个基本问题,但很难找到太多关于 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 具有多种功能,可以使用函数式编程,但您并非必须使用它们。