2
$\begingroup$

I have a bunch of symbols which are collected as a list inside a variable within a bit of code e.g.

a=1;b=2;
par={a,b};

I want to clear the values of both a and b using only a reference to par. Here is my attempt and the error produced:

Clear[Sequence@@par]
... Clear::ssym: Sequence@@par is not a symbol or a string.

I can understand why this gives an error but can't figure out a way out of it.

Thanks for your help

$\endgroup$
4
  • 1
    $\begingroup$ par is simply {1, 2} here, how would it know about the symbols a and b? $\endgroup$ Mar 31, 2017 at 9:47
  • $\begingroup$ To amplify Marius's comment, look at the result of ??par. $\endgroup$ Mar 31, 2017 at 9:48
  • $\begingroup$ I do get the idea. Is there a way, though ? $\endgroup$
    – jrekier
    Mar 31, 2017 at 9:50
  • $\begingroup$ An approach similar to this is one possibility: par = Hold[a, b]; and much later, Scan[Clear, par] or Clear @@ par. $\endgroup$ Mar 31, 2017 at 10:00

2 Answers 2

1
$\begingroup$

This will not work. Because you used Set, not SetDelayed. After executing this code:

a = 1; 
b = 2; 

par = {a, b}
OwnValues[par]

(*
    {1, 2}
    {HoldPattern[par] :> {1, 2}}
*)

par isn't a list with a and b. par is a list that contains {1, 2}.

For your task you can use this code:

a = 1; 
b = 2; 

par := {a, b}
par
OwnValues[par]

(* 
    {1, 2}
    {HoldPattern[par] :> {a, b}} 
*)

Now you must take list of values from OwnValues rule:

Hold[par] /. OwnValues[par]

(* Hold[{a, b}] *)

And if you want clear a and b:

Hold[par] /. OwnValues[par] /. Hold[{args__}] :> Clear[args]

par
{a, b}

(* 
    {a, b} 
    {a, b}
*)

Definition for par preserved and for a and b cleared

$\endgroup$
0
$\begingroup$

As others correctly pointed out, there is no way to establish variable names after the fact in this case. But if you have traced your code, which is a big if, of course, but imagine you did:

trace = Trace[
   a = 1; b = 2;
   par = {a, b}
];

Then you can fish out the variable names that were used during assignment and clear them:

Cases[
    trace,
    HoldPattern[par = vars : {___Symbol}] :> ClearAll @@ Unevaluated @ vars,
    All
];
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.