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
>
>
>
>