我想要一个 Maxima 函数来检测已经定义的函数。这可以被称为is_function,因此is_function(sin)和is_function(exp)将为真,但is_function(%pi)和is_function(foo)将为假(假设我还没有定义foo)。这已经存在了吗?
手册说
一些 Lisp 函数隐藏在 Maxima 包中,即以下 ... functionp ...
我不确定这到底意味着什么,但functionp(sin)返回false,即使我定义了 ,functionp(foo)也会返回。另外,如果我像以前一样定义,则失败并显示 message 。falsefoo(x) := x;fundef(sin)dispfun(sin)fundef: no such function: sinfundef(foo)foo(x)
定义函数的方法有多种,而 Maxima 确实没有办法检测其中任何一种。
更新:现在可以在https://github.com/maxima-project-on-github/maxima-packages文件夹 robert-dodier/fboundp 中找到先前解决方案的稍微扩展版本。
先前的解决方案:这里尝试查看 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;
Run Code Online (Sandbox Code Playgroud)
编辑:我制作了一个单独的函数来测试每种函数,并且我进行了测试以symbolp确保属性检查内容(?get和?mget)不会失败。