以最大值致电参考:可能吗?

时间:2019-07-02 02:14:21

标签: maxima

我正在尝试简化在Maxima的功能块定义中使用的重复操作的表示法。例如,代替写作

a: endcons(a,b),

每次,我都想替换为

a<-b.

但是,如果我定义

infix("<-")$
"<-"(a,b):= a: endcons(a,b)

我显然永远不会获得列表a来接收结尾处的新条目b

(%i1)   infix("<-");
(%o1)               "<-"
(%i50)  "<-"(a,b):= a: endcons(b,a);
(%o50)              a \<\- b:=a:endcons(b,a)
(%i48)  a:[];
(a)                 []
(%i51)  a<-b;
(%o51)              [b]
(%i52)  a;
(%o52)              []

因为ab在函数/操作符调用中被值调用。有什么方法可以让"<-"通过引用来调用a,因此即使在a被称为争论?

1 个答案:

答案 0 :(得分:1)

嗯,这激发了各种各样的想法。 (1)您可以使用内置函数extern "C"获得所需的效果,例如:pushpush(b, a)附加到绑定到b的列表上。

(2)除了内置函数外,所需的操作类型可能最容易在Maxima中实现为所谓的宏,该宏只是一个返回表达式然后进行求值的函数。例如:a。请注意,"<-"(a, b) ::= buildq([a, b], a: endcons(b, a))产生macroexpand(a <- b),而a:endcons(b,a)产生macroexpand(p <- q)。然后,如果您只写p:endcons(q,p)a <- b,您将得到您正在考虑的结果。请注意,p <- q实际上只是一个替换函数,它引用了其中要替换值的表达式。

(3)我对使用列表之类的集合的建议是考虑如何一次性获得所需结果,而不是逐步构建它。例如,也许您可​​以使用buildqsublistmap来构造结果。这是一个更大的主题的一部分,即函数式编程,它就是没有副作用的编程-缺少副作用使程序更易于理解,这是最重要的优化。