在Maxima中,函数定义中的fuction调用中的参数没有被替换。

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

问题

考虑以下脚本,用 Maxima

$ cat main.max
foo(a) ::= block(
    if a = 0 then return(0) else return(1)
)$

bar(a) ::= block(
    return(foo(a))
)$

foo(0);
bar(0);

执行这个脚本的结果是

$ cat main.max | maxima --very-quiet
                                       0
                                       1

这个问题

是不是应该叫 foo 本身的结果与从另一个函数中调用的结果一样(在这种情况下。bar)?

这里还有一个例子

$ cat main.max
foo(a) ::= block(disp(a))$
bar(a) ::= block(foo(a))$

foo(0)$
bar(0)$
$ cat main.max | maxima --very-quiet
                                       0

                                       a

换句话说 为什么不是... maxima 替换传递给 barfoo 的函数调用,它位于 bar?

其他背景

这是我目前使用的版本。

$ maxima --version
Maxima 5.43.2
arguments maxima function-call
1个回答
2
投票

::= 定义了一个函数,它引用(不评估)它的参数,函数的返回值由调用者评估。由于历史原因,这样的函数习惯上被称为 "宏"。

我想你要的是一个普通的、对参数进行评价的函数,它的定义为 :=. 试着用 := 对于 ::= 在你的函数定义中 -- 当我尝试这样做时,我得到的是0的 bar(0) 正如预期的那样。

宏是有用的,但在相对狭窄的情况下。我认为普通函数比宏更常见。

顺便说一句,在你展示的函数中。blockreturn 是不需要的。我的建议是干脆不写,把功能写得更简洁,从而更清晰。例如

foo(a) := if a = 0 then 0 else 1;
bar(a) := foo(a);

最后,请注意 = 只是字面比较,而非等价,等价是用 equal. 例如:假设 x 没有其他定义。那么 is(x = 0) 产量 falseis(equal(x, 0)) 得出以下表达式 equal(x, 0). 根据你正在做的事情,一个或另一个可能是合适的。

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