MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: A riddle: Functions that return unevaluated when they cannot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg82703] Re: A riddle: Functions that return unevaluated when they cannot
  • From: Szabolcs Horvát <szhorvat at gmail.com>
  • Date: Mon, 29 Oct 2007 05:33:23 -0500 (EST)
  • References: <ff9sin$5vc$1@smc.vnet.net> <ffckoe$sop$1@smc.vnet.net> <ffed3p$bg7$1@smc.vnet.net> <ffhqss$4mr$1@smc.vnet.net>

Albert wrote:
> Hi,
> 
> Is this what you are looking for?

Yes, it it.  Thank you!  My newsreader has misplaced your message, so I 
did not notice it until now.

A function like
g[x_] := Module[{res}, Pause[3]; res = x + 2; res /; res < 10]
reproduces the timing behaviour of Integrate[] et al. :-)  I was not 
familiar with this use of /; (it is described in the doc page of Module, 
not in the doc page of Condition)

> In[27]:= ClearAll[g]
> 
> In[28]:= g[x_]:=Module[{res=x+2},
> res/;res<10
> ]
> 
> In[29]:= g[15]
> Out[29]= g[15]
> 
> In[30]:= g[1]
> Out[30]= 3
> 
> That is, using a conditional on your last expression decides whether or 
> not a return value is returned or the input expression is returned 
> unevaluated. This could of course be a flag which tells whether your 
> calculation succeeded or not.
> 
> I can't remember where I found this trick, I don't know whether it is 
> documented and how/why it works. But I think it is used in the code of 
> some of the Standard Packages (and probably in the functions you 
> mentioned as well) so should work reliable, but I have no guarantees for 
> that...
> 
> hth,
> 
> albert
> 

-- 
Szabolcs


  • Prev by Date: Creating and installing one's own packages?
  • Next by Date: Re: Why is NonCommutativeMultiply Protected?
  • Previous by thread: Re: A riddle: Functions that return unevaluated when they cannot
  • Next by thread: Re: A riddle: Functions that return unevaluated when they cannot