MathGroup Archive 2010

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

Search the Archive

Re: Proper style for argument checking?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg111980] Re: Proper style for argument checking?
  • From: David Bailey <dave at removedbailey.co.uk>
  • Date: Mon, 23 Aug 2010 02:38:21 -0400 (EDT)
  • References: <i4o25b$akh$1@smc.vnet.net>

On 21/08/10 09:18, James Stein wrote:
> I use this cell in my notebooks:
>
> ClearAll[abort, abortLog, fail, failLog];
> abortLog = failLog = {};
> abort[s__] := (Beep[];
>     AppendTo[abortLog, {s}];
>     Print["Aborting: ", s];
>     Abort[]);
> fail[s__] := (Beep[];
>     AppendTo[failLog, {s}];
>     Print["Fail: ", s]
>     );
>
> Neither abort' nor 'fail' does exactly what you request, but why
> return the function unevaluated in case of failure?  My preference is
> either to abort on failure (normal case) or report and continue
> (regression testing).  In my experience, a function that returns
> unevaluated merely wreaks havoc higher in the calling chain.
>
> I'm eager to hear other responses to your query.
>
>
> On Fri, Aug 20, 2010 at 4:06 AM, Yaroslav Bulatov<yaroslavvb at gmail.com>  wrote:
>> I have a function, and I'd like to do several checks on arguments
>> before evaluating it. If some check fails, I want the function to
>> return unevaluated and print corresponding error message, what's the
>> proper style of doing it?
>>
>> Help for "Message" gives an example for a single check, but it seems
>> awkward to use same form for multiple checks.
>>
>>
>
The easiest way to write a function that fails by returning unevaluated, 
is to either add conditions to the individual arguments, or to write a 
condition at the end of the definition:

In[1]:= foo[x_] := Module[{y = x^2},
     y] /; x > 0;

In[2]:= foo[3]

Out[2]= 9

In[3]:= foo[-1]

Out[3]= foo[-1]

You can include a call to Message inside the test, if you wish.

As to whether this is a useful way for a function to behave - it 
obviously depends on what the function does, and what it is for! Those 
Mathematica functions that return unevaluated - e.g. Integrate - seem to 
be maths procedures, where the system may simply 'not know' how to do 
something, or where subsequent definitions may make an evaluation 
possible in the future.

If you expect a function might return unevaluated, why not check its 
Head to see if it is, say, Integrate, and then do whatever is appropriate?

David Bailey

http://www.dbaileyconsultancy.co.uk


  • Prev by Date: Re: Launch kernel and packages from Mac OS's launchd utility
  • Next by Date: Re: All componens different
  • Previous by thread: Re: Proper style for argument checking?
  • Next by thread: Hanging indent in Print[] output?