我正在尝试简化在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) []
因为a
和b
在函数/操作符调用中被值调用。有什么方法可以让"<-"
通过引用来调用a
,因此即使在a
被称为争论?
答案 0 :(得分:1)
嗯,这激发了各种各样的想法。 (1)您可以使用内置函数extern "C"
获得所需的效果,例如:push
将push(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)我对使用列表之类的集合的建议是考虑如何一次性获得所需结果,而不是逐步构建它。例如,也许您可以使用buildq
或sublist
或map
来构造结果。这是一个更大的主题的一部分,即函数式编程,它就是没有副作用的编程-缺少副作用使程序更易于理解,这是最重要的优化。