Re: Disappearing variables

*To*: mathgroup at smc.vnet.net*Subject*: [mg13853] Re: Disappearing variables*From*: "Allan Hayes" <hay at haystack.demon.cc.uk>*Date*: Mon, 31 Aug 1998 01:09:15 -0400*References*: <6rr9u0$15b@smc.vnet.net> <6s5khr$c62@smc.vnet.net> <6s8ean$ijn@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

Julian Stoev wrote in message <6s8ean$ijn at smc.vnet.net>... >On 28 Aug 1998, Allan Hayes wrote: > >|nobody at News.Dal.Ca wrote in message <6rr9u0$15b at smc.vnet.net>... |>I >want to to define a variable inside a function, as follows: f:=x=123; >|>Whenever I run f, x should be given the value of 123, and if x >doesn't |>exist, it should be created. However: |> >|>In[1]:= f:=x=123; >|>In[2]:=f >|>Out[2]:=123 >|>In[3]:=x >|>Out[3]:=123 ** x exists >|>In[4]:=Remove[x]; >|>In[5]:=f >|>Out[5]:=123 ** f seems to work >|>In[6]:=x >|>Out[6]:=x ** x doesn't exist anymore, even though f worked |> >|>It seems like x is created when I initially define f, whereas since f >is |>SetDelayed, x should be created when I run f. |>Does anyone know >why x is not created when I run f? |> >|>Vilis Nams >|> >| >|Vilis, >|Let's look at the assignments that are stored: | >|f:=x=123; >| >|?f >| >|"Global`f" >|f := x = 123 >| >|Remove[x] >| >|?f >| >|"Global`f" >|f := Removed["x"] = 123 >| >|?x >|Information::notfound: Symbol x not found." | >|So, f still evaluates with output 123 but it does not restore the >|assignment x=123 nor recreate x; and i is it allowed to assign >|Remove["x]" = 123. >| >|Removed["x"] >| >|Removed["x"] > >Let me add something. If you try: >In[1]:= SetDelayed[f,Set[x,123]] >In[2]:= x >Out[2]= x >In[3]:= f >Out[3]= 123 >In[4]:= x >Out[4]= 123 > >, you will find, that x has a value only after you check for f and this >is logical, because when you check for f, it executes Set[x,123]. > >The only problems I see are, that Removed[] is not mentioned in the >Mathematica book and in the help. The info I found about it is In[5]:= >?Removed >"Removed[string] is printed to indicate a symbol that has been removed." > >Also it is not very clear how x got defined somehow if SetDelayed has >attributes HoldAll. Even when I tried > >In[1]:= SetDelayed[f,HoldComplete[Set[x,123]]] > >I got > >In[2]:= x >Out[2]= x > >--Julian Stoev > Julian: >Also it is not very clear how x got defined somehow if SetDelayed has >attributes HoldAll The following may help - there is more about this in Mathematica in Education and Research, Volume 7, Number 1, pp 32-33. Note that although hold-attributes hold evaluation they also allow us, or Mathematica, to specify how to continue. In[1]:= Clear["`*"] In[2]:= SetDelayed[f,Set[x,123]] (* store SetDelayed[f,Set[x,123]] (unevaluated - possible since SetDelayed has attribute HoldAll); output Null (not shown) *) In[3]:= ?f "Global`f" f := x = 123 In[4]:= f (* f is replaced by Set[x,123] which is then evaluated with the results that Set[x,123] is stored and the output is 123*) Out[4]= 123 In[5]:= ?x "Global`x" x = 123