RE: Re: Evaluation of Conditional Definitions(2)
- To: mathgroup at smc.vnet.net
- Subject: [mg33923] RE: [mg33819] Re: Evaluation of Conditional Definitions(2)
- From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
- Date: Tue, 23 Apr 2002 07:13:44 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Dear David and Allan, this is a very ingenious method to force the Update of g when accessing dependend expressions. It might however become a bit nasty to follow all involved dependencies when assigning values, e.g. for the case where you have many conditional definitions all dependend on the same global variable. Here I report on an observation I made, where update is forced by only introducing a condition on that global variable: In[1]:= Clear[f, a, UseDefinition, expr] In[2]:= f[a] /; UseDefinition := 2 In[3]:= UseDefinition = False; In[4]:= expr := f[a] /; UseDefinition expr := f[a] (* it only works if the Condition is attached to the rhs *) In[6]:= Information["expr", LongForm -> False] Global`expr expr := f[a] /; UseDefinition expr := f[a] In[7]:= expr Out[7]= f[a] In[8]:= UseDefinition = True; In[9]:= expr Out[9]= 2 In[10]:= UseDefinition = False; In[11]:= expr Out[11]= f[a] In[12]:= UseDefinition = True; In[13]:= expr Out[13]= 2 In[14]:= UseDefinition = False; In[15]:= expr Out[15]= f[a] Of course all this might be accidential behaviour and unreliable. What bothers me is: a precise understanding of the exact evaluation sequence is fundamental for mastering programming. Quite obviously mine has shown to have holes. David, possibly for your application it might suffice to assign NValues to your symbol. So you might easily decide when you want to have kept the results of a calculation in symbolical or when in numerical form: In[126]:= Clear[f, g, a] In[127]:= N[f[a], ___] = 2 N[g[a], ___] = 3 Out[127]= 2 Out[128]= 3 In[129]:= NValues /@ {f, g} Out[129]= {{HoldPattern[N[f[a], ___]] :> 2}, {HoldPattern[N[g[a], ___]] :> 3}} In[130]:= expr := f[a] + g[a] In[131]:= expr Out[131]= f[a] + g[a] In[141]:= expr + 5 // N Out[141]= 10. Observe that the result cannot be a precise number, yet of any precision. Another application: In[142]:= a = {{Cos[\[CurlyPhi]], Sin[\[CurlyPhi]]}, {-Sin[\[CurlyPhi]], Cos[\[CurlyPhi]]}} In[144]:= N[\[CurlyPhi]] = \[Pi]/3; In[145]:= HoldForm[Transpose[a].{1, 0}] // TraditionalForm Out[145]//TraditionalForm= \!\(\*FormBox[TagBox[\(a\^T . {1, 0}\), HoldForm], TraditionalForm]\) In[146]:= % // ReleaseHold Out[146]= {Cos[\[CurlyPhi]], Sin[\[CurlyPhi]]} In[147]:= % // N Out[147]= {0.5, 0.866025} In[149]:= \!\(\@3/2 // N\) Out[149]= 0.866025 yours, Hartmut > -----Original Message----- > From: Allan Hayes [mailto:hay at haystack.demon.co.uk] To: mathgroup at smc.vnet.net > Sent: Friday, April 19, 2002 8:28 AM > To: mathgroup at smc.vnet.net > Subject: [mg33923] [mg33819] Re: Evaluation of Conditional Definitions(2) > > > David, > Here is another way, one that lets us use either Set or SetDelayed. > The statement, from the Help Browser, > > - Using Update will never give you incorrect results, > although it will slow > down the operation of the system. > > though technically correct, looks in need of a little more > explanation, > since the result is changed. > > > Clear[g,a,UseDefinition]; > g[a]/;UseDefinition==rue:=2 > expr/;(Update[g];True)=g[a]; (*uses Set*) > > UseDefinition=False; > expr > > g[a] > > UseDefinition=True; > expr > > 2 > > UseDefinition=False; > expr > > g[a] > > UseDefinition=True; > expr > > 2 > > Allan > > --------------------- > Allan Hayes > Mathematica Training and Consulting > Leicester UK > www.haystack.demon.co.uk > hay at haystack.demon.co.uk > Voice: +44 (0)116 271 4198 > Fax: +44 (0)870 164 0565 > > > >