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
不替换传递给 bar
在 foo
函数调用中传递给 bar
的参数?
其他上下文
这是我目前使用的版本
$ maxima --version
Maxima 5.43.2
::=
定义了一个引用(不计算)其参数的函数,函数的 return 值由调用者计算。由于历史原因,这样的函数通常称为 "macro"。
我认为您需要一个普通的参数求值函数,它由 :=
定义。尝试在您的函数定义中用 :=
替换 ::=
- 当我尝试这样做时,我按预期得到 bar(0)
的 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)
。根据您正在做的事情,一个或另一个可能是合适的。
问题
考虑在 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
::=
定义了一个引用(不计算)其参数的函数,函数的 return 值由调用者计算。由于历史原因,这样的函数通常称为 "macro"。
我认为您需要一个普通的参数求值函数,它由 :=
定义。尝试在您的函数定义中用 :=
替换 ::=
- 当我尝试这样做时,我按预期得到 bar(0)
的 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)
。根据您正在做的事情,一个或另一个可能是合适的。