考虑以下脚本,用 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
替换传递给 bar
在 foo
的函数调用,它位于 bar
?
这是我目前使用的版本。
$ maxima --version
Maxima 5.43.2
::=
定义了一个函数,它引用(不评估)它的参数,函数的返回值由调用者评估。由于历史原因,这样的函数习惯上被称为 "宏"。
我想你要的是一个普通的、对参数进行评价的函数,它的定义为 :=
. 试着用 :=
对于 ::=
在你的函数定义中 -- 当我尝试这样做时,我得到的是0的 bar(0)
正如预期的那样。
宏是有用的,但在相对狭窄的情况下。我认为普通函数比宏更常见。
顺便说一句,在你展示的函数中。block
和 return
是不需要的。我的建议是干脆不写,把功能写得更简洁,从而更清晰。例如
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)
. 根据你正在做的事情,一个或另一个可能是合适的。