Remove [was Re: RE: Re: Finding variables in a very long expression]
- To: mathgroup at smc.vnet.net
- Subject: [mg31566] Remove [was Re: [mg31456] RE: [mg31410] Re: Finding variables in a very long expression]
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sun, 11 Nov 2001 16:26:10 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Dear Fred and Hartmut,
I have collected the observations that have come up. I am puzzled by the
behaviour of Print in FURTHER NOTES 2), at the end.
REMOVE
Remove[a] causes a in the rules stored up to and including from the current
input line, and in the output of the current line to be replaced by a
special symbol that always prints as Removed[a], but Remove[a]'s in
different input lines
produce different Removed[a]'s (Fred Simons). These replacements preserve
the structure of
expressions , which would not happen if the occurences of a were simply
remove, while telling us about the removal.
Examples (Quit[]must always be evaluated in its own input line)
Quit[]
{b=a, Remove[a],c=a}
{b,c}
{Removed[a],Null,Removed[a]}
{Removed[a],Removed[a]}
Remove[a] is a print form for a symbol.
Check that Removed[a] is a symbol:
Head[b]
Symbol
The two occurences of Removed[a] above, values of b and c, are the same (
Evaluate[b] below gives Removed[a] - Fred Simons noted that Remove[a] can be
assigned a value)
Evaluate[b]=2;
{b,c}
{2,2}
Here, following our description at the beginning, only the a in b=a is
changed:
Quit[]
b=a;
Remove[a];
c=a;
{b,c}
{Removed[a],a}
And in the following, the two symbols that print as Removed[a] are
different
Quit[]
{b=a,Remove[a]}
{c=a,Remove[a]}
{b,c}
{Removed[a],Null}
{Removed[a],Null}
{Removed[a],Removed[a]}
That the two Removed[a]'s are different is show by the following, had they
been the same then both b and c would have evaluated to 3.
Evaluate[b]=2;
Evaluate[c] =3;
{b,c}
{2,3}
Here is we find that the values of the two versiona of Removed[a] are
stored in
OwnValues[Removed[a]]
ReleaseHold[Hold[OwnValues[b]]/.OwnValues[b]]
{HoldPattern[Removed[]] :> 2}
ReleaseHold[Hold[OwnValues[c]]/.OwnValues[c]]
{HoldPattern[Removed[]] :> 3}
FURTHER NOTES
1) Notice the TagBox in the cell expression of the output from
Remove[a];a
Cell[BoxData[
TagBox[
RowBox[{"Removed", "[", "\<\"a\"\>", "]"}],
False,
Editable->False]], "Output",
CellLabel->"Out[13]="]
2) A problem - why does the first Print[b=a] print a when the value of b
is Removed[a]?
Quit[]
{Print[b=a], Remove[a], Print[c=a];a};
{b,c}
a
Removed[a]
{Removed[a],Removed[a]}
{Removed[a],Removed[a]}
3) What we see as Removed[a] in the output above is not the same as the
output from typing in Removed[a]:
b
Removed[a]
b== Removed[a]
Removed[a]==Removed[a]
4) but
ToExpression[ToString[b]] \[Equal] Removed[a]
True
Hartmut Wolf noticed this.
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
----- Original Message -----
From: "Fred Simons" <f.h.simons at tue.nl>
To: mathgroup at smc.vnet.net
<Hartmut.Wolf at t-systems.de>
Subject: [mg31566] Re: [mg31456] RE: [mg31410] Re: Finding variables in a very long
expression
> Dear Allan and Hartmut,
>
> With much interest I read your remarks on removed symbols.
>
> It seems to me that the only reason for the presence of the name Removed
in
> the system is that it gives the information about Removed["a"]. The name
> itself has no function properties, anyway it does not transform
Removed["a"]
> into a removed symbol a.
>
> Here are some more observations.
>
> In[6]:= c= f[a]; d = g[a];
> Remove[a]
> {c, d}
>
> Out[8]=
> {f[Removed[a]], g[Removed[a]]}
>
> In this expression, Removed[a] is a symbol:
>
> In[9]:=
> {c[[1]], c[[1]] // FullForm, c[[1]] // AtomQ,c[[1]] // Head}
>
> Out[9]=
> {Removed[a],Removed["a"],True,Symbol}
>
> When we type Removed["a"] ourselves, we have something completely
different,
> as in your remarks:
>
> In[11]:=
> {Removed["a"] , c[[1]]}
> Head /@ {Removed["a"] , c[[1]]}
> Removed["a"] \[Equal] c[[1]]
>
> Out[11]=
> {Removed[a],Removed[a]}
>
> Out[12]=
> {Removed,Symbol}
>
> Out[13]=
> Removed[a]==Removed[a]
>
> Now it is rather surprising that we can assign values to removed symbols.
>
> In[14]:=
> Hold @@ OwnValues[c] /. RuleDelayed[_, f[x_]] \[RuleDelayed] Set[x, \[Pi]]
> //
> ReleaseHold;
> OwnValues[c]
> {c, d}
>
> Out[15]=
> {HoldPattern[c]\[RuleDelayed]f[Removed[a]]}
>
> Out[16]=
> {f[\[Pi]],g[\[Pi]]}
>
> Now we recreate the name a and remove it.
>
> In[17]:=
> e=h[a]; Remove[a]; {c,d,e}
>
> Out[17]=
> {f[\[Pi]],g[\[Pi]],h[Removed[a]]}
>
> A new Removed[a] has been made that is different from the previous one,
that
> still exists.
>
> In[18]:=
> Hold @@ OwnValues[c] /.
> RuleDelayed[_, f[x_]] \[RuleDelayed]Clear[x] // ReleaseHold
> {c,d,e}
>
> Out[19]=
> {f[Removed[a]],g[Removed[a]],h[Removed[a]]}
>
> In[20]:=
> Hold @@ OwnValues[d] /. RuleDelayed[_, g[x_]] \[RuleDelayed] Set[x, 2] //
> ReleaseHold;
> Hold @@ OwnValues[e] /. RuleDelayed[_, h[x_]] \[RuleDelayed] Set[x, 3] //
> ReleaseHold;
> {c,d,e}
>
> Out[22]=
> {f[2],g[2],h[3]}
>
> So each time when a symbol is removed, a new removed symbol is created,
not
> overwriting previously made removed symbols. It is more or less like local
> variables in Module.
>
> Regards,
>
> Fred Simons
>
--
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