如何检测 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 falsefunctionp(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) 不会失败。