[Date Index]
[Thread Index]
[Author Index]
Re: Assertions in Mathematica?
*To*: mathgroup at smc.vnet.net
*Subject*: [mg113448] Re: Assertions in Mathematica?
*From*: Daniel Lichtblau <danl at wolfram.com>
*Date*: Fri, 29 Oct 2010 06:27:48 -0400 (EDT)
kj wrote:
> What's the best to implement assertions in Mathematica? By assertions
> I mean statements like assert(exp) in C, which generate an error
> if exp evaluates to false.
>
> This *should* be trivial, but it's Mathematica, so...
>
> Naively, I tried defining:
>
> Assert[exp_, msg__] := If[!exp, Message[msg]; Abort[]]
>
> ...which, of course, failed to work (as I've learned to expect);
> instead it produced a cryptic error "Message::name : Message name
> ... is not of the form symbol::name or symbol::name::language."
>
> I tried many other things, but after wasting 1 hour on this
> ridiculously trivial programming task, I'm reduced to begging for
> help. (This, by the way, is always the way it is with me and
> Mathematica, and I've been using it on-and-off for almost 20 years.
> The documentation is as useless to me today as it was 20 years ago.
> I find it as horrible as the rest of Mathematica is brilliant.)
>
> I've posted desperate questions over programming mind-numbing
> trivialities like this one in Mathematica before, i.e. questions
> that seem so elementary and fundamental that no one who has access
> to the documentation and who can read should *ever* have to ask
> them. I ask them less wanting to get the answer to the questions
> themselves than hoping to learn how I could have answered such
> questions by myself. But I've never found how to do this. Those
> who know the answers *already* can give them to me if they feel so
> inclined. (And how they got to know the answer to begin with, I
> don't know; I imagine it took years of sustained Mathematica
> programming. Or maybe they asked a similar question before to
> someone who already knew the answer...) But no one has been able
> to tell me how someone who *doesn't* know the answers to such questions
> already can figure it out without outside help.
>
> But hope springs eternal! If someone is kind enough to tell me
> how I could implement my Assert, I'd be most grateful. If someone
> can tell me how I could have arrived at this answer by myself by
> consulting the documentation, I'd be ecstatic.
>
> TIA,
>
> kj
I'm sure better responses will come your way. Here are some things I'd
recommend.
(1) Check the documentation for the correct syntax/usage of Message.
(2) Consider using Print instead of Message. It might be more what you
want. (Hard to say, without seeing a concrete example from you).
(3) Make the function have attribute HoldAll or HoldRest. That way the
second argument is not evaluated unless the assertion triggers. Example:
assert[exp_, msg__] := If[!exp, Print[msg]; Abort[]]
In[42]:= assert[5==5., aa=bb]
In[43]:= aa
Out[43]= bb
Notice it evaluated the second argument even though the assertion was
not triggered. In contrast, the held variant below does not do such
evaluation.
In[53]:= SetAttributes[assert2,HoldAll]
In[54]:= assert2[exp_, msg__] := If[!exp, Print[msg]; Abort[]]
In[55]:= assert2[5==5., xx=yy]
In[56]:= xx
Out[56]= xx
(4) Implement your "Assert" with a lower case 'a', e.g. assert[]. One
excellent reason to do this is that it woun't give you a shadowing
problem if you get version 8 of Mathematica, as that has Assert[].
Daniel Lichtblau
Wolfram Research
Prev by Date:
**Re: Manually nested Tables faster than builtin nesting?**
Next by Date:
**Re: Assertions in Mathematica?**
Previous by thread:
**Re: Assertions in Mathematica?**
Next by thread:
**Re: Assertions in Mathematica?**
| |