Re: Clear variables in a list
- To: mathgroup at smc.vnet.net
 - Subject: [mg112071] Re: Clear variables in a list
 - From: Leonid Shifrin <lshifr at gmail.com>
 - Date: Sun, 29 Aug 2010 02:49:02 -0400 (EDT)
 
Chris,
nothing will help if your variable list is defined as in your example (with
Set, and after the variables got their definitions), since it
contains already evaluated values:
?vars
Global`vars
vars={1,2,3}
If you defined it with SetDelayed (or used Set, but before you assigned
values to your variables):
vars := {a, b, c}
?vars
Global`vars
vars:={a,b,c}
Then this is possible, although I would not say it is trivial:
ReleaseHold[Clear @@@ (Hold[vars] /. OwnValues[vars])]
If the only purpose of your <vars> variable is to be used to clear the
variables, then I
suggest that you use Hold instead of List, as a container head:
a = 1; b = 2; c = 3;
heldvars = Hold[a, b, c];
Then clearing the variables becomes trivial, and all of the above problems
are avoided:
Clear @@ heldvars
This is what I often use for similar purposes.
As a side remark, the idiom f[Unevaluated[#]]& is flawed, because the
argument gets
evaluated during pure-function parameter passing stage, long before it is
substituted
into the body of a pure function. This is one place where the current
documentation is
wrong: f is *not* equivalent to f[#]&. Simple counter-example:
In[17]:= Hold[Print["*"]]
Out[17]= Hold[Print["*"]]
In[16]:= Hold[#] &[Print["*"]]
During evaluation of In[16]:= *
Out[16]= Hold[Null]
Returning to f[Unevaluated[#]]&: it leaks evaluation in the same way:
In[13]:= ClearAll[f];
f[Unevaluated[#]] &[Print["*"]]
During evaluation of In[13]:= *
Out[14]= f[Unevaluated[Null]]
This is what should be used instead, to achieve the desired effect:
In[15]:= Function[x, f[Unevaluated[x]], HoldAll][Print["*"]]
Out[15]= f[Unevaluated[Print["*"]]]
Hope this helps.
Regards,
Leonid
On Sat, Aug 28, 2010 at 3:01 PM, Chris Degnen <degnen at cwgsy.net> wrote:
> Any suggestions how to clear variables in a list, eg:
>
> a = 1; b = 2; c = 3; vars = {a, b, c};
>
> None of these work:
>
> Map[Clear, vars]
> Map[Clear[Unevaluated[#]] &, vars]
> Apply[Clear, vars, {1}]
>
> Only this works: Clear[a, b, c]
>
>
>