Maxima 中未替换函数定义中函数调用中的参数

Argument in fuction call inside function definition is not being replaced in Maxima

问题

考虑在 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

::= 定义了一个引用(不计算)其参数的函数,函数的 return 值由调用者计算。由于历史原因,这样的函数通常称为 "macro"。

我认为您需要一个普通的参数求值函数,它由 := 定义。尝试在您的函数定义中用 := 替换 ::= - 当我尝试这样做时,我按预期得到 bar(0) 的 0。

宏很有用,但在相对狭窄的情况下。我觉得普通函数比宏更常用

顺便说一句,在您展示的函数中,blockreturn 是不需要的。我的建议是将它们排除在外,使功能更简洁,从而更清晰。例如

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

最后注意,=只是字面比较,不是等价;用 equal 测试等价性。例如。假设 x 没有另外定义。然后 is(x = 0) 产生 false,但 is(equal(x, 0)) 产生表达式 equal(x, 0)。根据您正在做的事情,一个或另一个可能是合适的。