如何检测Maxima中的内置函数?

Nei*_*and 1 maxima

我想要一个 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)

Rob*_*ier 5

定义函数的方法有多种,而 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)不会失败。