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