Re: conditional pattern question
- To: mathgroup at smc.vnet.net
- Subject: [mg15693] Re: conditional pattern question
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Mon, 1 Feb 1999 14:54:13 -0500 (EST)
- References: <7913bm$e3d@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Original posting beneath ************************************** David, I don't have the answer, but here are some observations and a guess. We also have Clear[h,a]; h[x_/;Print[a=1]]:= 1 a a h[x_/;Print[a=2]]:= 2 1 a 1 h[x_/;Print[a=3]]:= 3 1 2 a 2 My guess is that this is to do with deciding whether to store a new rule or replace the existing one. In fact the decision seems to be taken on just syntactical evidence. ?h "Global`h" h[x_ /; Print[a = 1]] := 1 h[x_ /; Print[a = 2]] := 2 h[x_ /; Print[a = 3]] := 3 The following is understandable as the result of testing for the applicability of the two rules h[x]; 1 2 3 a 3 The escaping of definions from a test could cause problems. Allan --------------------- Allan Hayes Mathematica Training and Consulting www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 *********************************************************************** David Reiss wrote in message <7913bm$e3d at smc.vnet.net>... > >I don't understand the following behavior: could someone educate me >here? ...or is it a bug? > >First clear the functions and variables. > > >In[1]:= >ClearAll[NumericWithMessageQ,f]; > > >Now define a message: > > >In[2]:= >Test::testmessage="The argument `1` has generated this message."; > > >Introduce a boolian test that has the added side effect of generating a >message when the test yields False (I am using NumericQ as an example, >but the problem that I am illustrating is independent of this): > > >In[3]:= >NumericWithMessageQ[z_]:= > If[NumericQ[z], > True, > Message[Test::testmessage,z];False] > > >Now give a function definition for numeric values of the argument > > >In[4]:= >f[y_?NumericWithMessageQ]:=1; > > >Also give a definition for all other cases: the message defind a bove is >generated when this is executed-- I didn't expect this to happen. That >the message is generated at this point puzzels me. I don't understand >why this happens. > > >In[5]:= >f[y_]:=2; > >Test::"testmessage": "The argument \!\(y_\) has generated this message." > > >Note though that the function works properly. Here is a numeric case: > > >In[6]:= >f[4] > >Out[6]= >1 > > >And here is a non-numeric case (and the message is generated as per the >design). > > >In[7]:= >f[a] > >Test::"testmessage": "The argument \!\(a\) has generated this message." > >Out[7]= >2 > > >If the function is specified as follows, the message is not generated >unexpectedly when the function is defined. > > >In[8]:= >ClearAll[f] > >In[9]:= >f[y_]/;NumericWithMessageQ[y]:=1; > >In[10]:= >f[y_]:=2; > > >And the function works as above. > > >In[11]:= >f[4] > >Out[11]= >1 > >In[12]:= >f[a] > >Test::"testmessage": "The argument \!\(a\) has generated this message." > >Out[12]= >2 > >-- > > > >---------------------------------------- Scientific Arts: >Creative Services and Consultation >for the Applied and Pure Sciences > >David Reiss >Email: dreiss at !SPAMscientificarts.com >---------------------------------------- > > > >Remove the !SPAM to send email >