listofops?



On Oct. 20, Dieter Kaiser wrote:
-----------
   > Maxima has the Lisp function isinop. I have extended this function some
   > times ago to return not only true and false, but a whole expression.
   > With this function the following is possible:
   >
   > (%i1) expr:abs(x)+bessel_y(1,y)+struve_h(0,z)+'integrate(f(x),x);
   > (%o1) 'integrate(f(x),x)+abs(x)+bessel_y(1,y)+struve_h(0,z)
   >
   > (%i2) ?isinop(expr,abs);
   > (%o2) abs(x)
   >
   > (%i3) ?isinop(expr,struve_h);
   > (%o3) struve_h(0,z)
[snip]
   >
   >
   > If the operator is present, the whole expression is returned. This
   > functions checks only for the first appearance of the operator. I think
   > it is a nice function which we might add for the Maxima user.
-----------
Thanks for the information about this Lisp function.
With the code which uses ?isinop
instead of funp1:
----
 spfunp (expr) :=
    block ([spfun,spf:false],

        for spfun in
           [bessel_j,bessel_y,bessel_i,bessel_k,
            hankel_1,hankel_2,struve_h,struve_l,
            assoc_legendre_p,assoc_legendre_q,
             %f,gamma,gammagreek,gammaincomplete,
            hypergeometric,slommel,%m,%w,erfc,
            expintegral_e,expintegral_e1,
            expintegral_ei,expintegral_li,
            expintegral_si,expintegral_ci,
            expintegral_shi,expintegral_chi,
             kelliptic,parabolic_cylinder_d]  do

             if ?isinop(expr,spfun) # false then (
                  spf:true,
                  return()),
        spf)$
---------------
I get same answers as before:
(%i2) spfunp(bessel_y(2,x));
(%o2)                                true
(%i3) spfunp(x);
(%o3)                                false
(%i4) spfunp(x*bessel_y(2,x)+bessel_j(0,x));
(%o4)                                true
(%i5) expr:abs(x)+bessel_y(1,y)+struve_h(0,z)+'integrate(f(x),x)$
(%i6) spfunp(expr);
(%o6)                                true
-------------------------------------
On Oct. 20, Stavros Makrakis wrote:

>The code below [referring to my funp1 code]
> is much less efficient than using listofops and
> intersecting with whatever list of special functions
>  you like.
---------------------
I have used the following approach with your
listofops function, but there is probably a
better arrangement?
------------------------------------
declare(union,nary)$

  listofops(expr) := block([inflag:true], if mapatom(expr) then {} else
         adjoin(op(expr),xreduce(union,maplist(listofops,expr))))$

  spfunp (eexpr) :=
    (if length ( intersect (listofops (eexpr),
                     {bessel_j,bessel_y,bessel_i,bessel_k,
                     hankel_1,hankel_2,struve_h,struve_l,
                      assoc_legendre_p,assoc_legendre_q,
                      %f,gamma,gammagreek,gammaincomplete,
                      hypergeometric,slommel,%m,%w,erfc,
                      expintegral_e,expintegral_e1,
                      expintegral_ei,expintegral_li,
                      expintegral_si,expintegral_ci,
                      expintegral_shi,expintegral_chi,
                      kelliptic,parabolic_cylinder_d})) > 0 then
                         true
     else false)$
-------------------------------------
which produces the same output as before.

Not clear to me what effects the union,nary
declaration would have on any other code
in the same session?

Ted