Re: Letting functions not evaluate
- To: mathgroup at smc.vnet.net
- Subject: [mg79491] Re: [mg79416] Letting functions not evaluate
- From: Carl Woll <carlw at wolfram.com>
- Date: Fri, 27 Jul 2007 06:08:22 -0400 (EDT)
- References: <200707260933.FAA05595@smc.vnet.net>
Josh Burkart wrote: >Say I have a function f[x], and, for certain values of the argument x, I don't want it to evaluate to anything. E.g., say > >f[x_]:=Mod[10,x], > >and if x is not an integer, then I want f[x] to yield simply f[x]. One way to achieve this is through pattern matching, i.e., > >f[x_Integer]:=Mod[10,x] > >Although this works perfectly in this example, it is somewhat limited. For instance, if I have a function taking two arguments and I want to perform some check on both arguments together to see whether the function should evaluate or not, pattern matching won't work. E.g., > >g[x_,y_]:=Mod[10,x*y] > >only if x*y is an integer (even if x and y individually aren't integers). I think there's some way to do this more generally than pattern matching, since for instance if I enter > >In[11]:= Integrate[Gamma[x]^5,x]//FullForm >Out[11]//FullForm= Integrate[Power[Gamma[x],5],x] > >Mathematica just returns the input unevaluated after taking a little time to decide it's not resolvable. Anyone know how to do this? Using an If[] statement doesn't work, since > >In[1]:= f[x_]:=If[IntegerQ[x], Mod[10, x], f[x]] >In[4]:= f[3] >Out[4]= 1 >In[3]:= f[3.3] >During evaluation of In[3]:= $IterationLimit::itlim: Iteration limit of 4096 exceeded. >> >Out[3]= Hold[f[3.3]] > >results in infinite recursion. HoldForm[] and Defer[] also produce somewhat dissatisfactory results, since the FullForm[] of what they return is actually HoldForm/Defer[blah blah]. > > Use Condition (/;). For example: g[x_, y_] := Mod[10, x y] /; IntegerQ[x y] In[63]:= g[2, 3] Out[63]= 4 In[64]:= g[2, 3.3] // FullForm Out[64]//FullForm= g[2,3.3`] Carl Woll Wolfram Research
- References:
- Letting functions not evaluate
- From: Josh Burkart <jburkart@ucdavis.edu>
- Letting functions not evaluate