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