如何检测 Maxima 中的内置函数?
How to detect built-in functions in Maxima?
我想要一个 Maxima 函数来检测已经定义的函数。这可以称为 is_function
,因此 is_function(sin)
和 is_function(exp)
为真,但 is_function(%pi)
和 is_function(foo)
为假(假设我没有定义 foo
).这个已经存在了吗?
手册说
Some Lisp functions are shadowed in the Maxima package, namely the following ... functionp ...
我不确定这到底是什么意思,但是 functionp(sin)
returns false
,functionp(foo)
甚至 returns false
如果我定义 foo(x) := x;
。此外,fundef(sin)
和 dispfun(sin)
失败并显示消息 fundef: no such function: sin
,尽管如果我像以前一样定义 foo(x)
则 fundef(foo)
可以工作。
有多种定义函数的方法,Maxima 并没有真正检测到其中任何一种方法。
更新:现在可以在文件夹 robert-dodier/fboundp.
中的 https://github.com/maxima-project-on-github/maxima-packages 找到先前解决方案的略微扩展版本
上一个解决方案:这里尝试查看 Lisp 符号属性以查看其中的内容。
/* fboundp.mac -- detect different kinds of functions in Maxima
* copyright 2020 by Robert Dodier
* I release this work under terms of the GNU General Public License
*
* Examples:
*
/* Simplifying function defined in Lisp: */
fboundp(sin);
true;
fboundp_simplifying(sin);
true;
/* DEFUN (ordinary argument-evaluating) function defined in Lisp: */
fboundp(expand);
true;
fboundp_ordinary_lisp(expand);
true;
/* DEFMSPEC (argument-quoting) function defined in Lisp: */
fboundp(kill);
true;
fboundp_quoting(kill);
true;
/* Maxima ordinary function: */
(kill(foo),
foo(x) := x,
fboundp(foo));
true;
fboundp_ordinary_maxima(foo);
true;
/* Maxima array function: */
(kill(bar),
bar[x](y) := x*y,
fboundp(bar));
true;
fboundp_array_function(bar);
true;
/* Maxima macro: */
(kill(baz),
baz(x) ::= buildq([x], x),
fboundp(baz));
true;
fboundp_maxima_macro(baz);
true;
*
*/
fboundp(a) :=
fboundp_simplifying(a)
or fboundp_ordinary_lisp(a)
or fboundp_quoting(a)
or fboundp_ordinary_maxima(a)
or fboundp_array_function(a)
or fboundp_maxima_macro(a);
fboundp_simplifying(a) :=
symbolp(a) and ?get(a, ?operators) # false;
fboundp_ordinary_lisp(a) :=
symbolp(a) and ?fboundp(a) # false;
fboundp_quoting(a) :=
symbolp(a) and ?get(a, ?mfexpr\*) # false;
fboundp_ordinary_maxima(a) :=
symbolp(a) and ?mget(a, ?mexpr) # false;
fboundp_array_function(a) :=
symbolp(a) and ?mget(a, ?aexpr) # false;
fboundp_maxima_macro(a) :=
symbolp(a) and ?mget(a, ?mmacro) # false;
编辑:我制作了一个单独的函数来测试每种函数,并且我对 symbolp
进行了测试以确保 property-inspection 东西(?get
?mget
) 不会失败。
我想要一个 Maxima 函数来检测已经定义的函数。这可以称为 is_function
,因此 is_function(sin)
和 is_function(exp)
为真,但 is_function(%pi)
和 is_function(foo)
为假(假设我没有定义 foo
).这个已经存在了吗?
手册说
Some Lisp functions are shadowed in the Maxima package, namely the following ... functionp ...
我不确定这到底是什么意思,但是 functionp(sin)
returns false
,functionp(foo)
甚至 returns false
如果我定义 foo(x) := x;
。此外,fundef(sin)
和 dispfun(sin)
失败并显示消息 fundef: no such function: sin
,尽管如果我像以前一样定义 foo(x)
则 fundef(foo)
可以工作。
有多种定义函数的方法,Maxima 并没有真正检测到其中任何一种方法。
更新:现在可以在文件夹 robert-dodier/fboundp.
中的 https://github.com/maxima-project-on-github/maxima-packages 找到先前解决方案的略微扩展版本上一个解决方案:这里尝试查看 Lisp 符号属性以查看其中的内容。
/* fboundp.mac -- detect different kinds of functions in Maxima
* copyright 2020 by Robert Dodier
* I release this work under terms of the GNU General Public License
*
* Examples:
*
/* Simplifying function defined in Lisp: */
fboundp(sin);
true;
fboundp_simplifying(sin);
true;
/* DEFUN (ordinary argument-evaluating) function defined in Lisp: */
fboundp(expand);
true;
fboundp_ordinary_lisp(expand);
true;
/* DEFMSPEC (argument-quoting) function defined in Lisp: */
fboundp(kill);
true;
fboundp_quoting(kill);
true;
/* Maxima ordinary function: */
(kill(foo),
foo(x) := x,
fboundp(foo));
true;
fboundp_ordinary_maxima(foo);
true;
/* Maxima array function: */
(kill(bar),
bar[x](y) := x*y,
fboundp(bar));
true;
fboundp_array_function(bar);
true;
/* Maxima macro: */
(kill(baz),
baz(x) ::= buildq([x], x),
fboundp(baz));
true;
fboundp_maxima_macro(baz);
true;
*
*/
fboundp(a) :=
fboundp_simplifying(a)
or fboundp_ordinary_lisp(a)
or fboundp_quoting(a)
or fboundp_ordinary_maxima(a)
or fboundp_array_function(a)
or fboundp_maxima_macro(a);
fboundp_simplifying(a) :=
symbolp(a) and ?get(a, ?operators) # false;
fboundp_ordinary_lisp(a) :=
symbolp(a) and ?fboundp(a) # false;
fboundp_quoting(a) :=
symbolp(a) and ?get(a, ?mfexpr\*) # false;
fboundp_ordinary_maxima(a) :=
symbolp(a) and ?mget(a, ?mexpr) # false;
fboundp_array_function(a) :=
symbolp(a) and ?mget(a, ?aexpr) # false;
fboundp_maxima_macro(a) :=
symbolp(a) and ?mget(a, ?mmacro) # false;
编辑:我制作了一个单独的函数来测试每种函数,并且我对 symbolp
进行了测试以确保 property-inspection 东西(?get
?mget
) 不会失败。