Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: How to call 'Clear' from within a function?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg124874] Re: How to call 'Clear' from within a function?
  • From: James Stein <mathgroup at stein.org>
  • Date: Fri, 10 Feb 2012 05:54:39 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201202091038.FAA18317@smc.vnet.net> <CAEtRDSdUiP2DYhCo8DLRn0ANKdbjZMw3VdtXy+6+khaj3=0U2g@mail.gmail.com>

Thanks for responding, Bob. Just three points:

(1) According to Mathematica's online documentation:

Clear [ "form-1", "form-2", ...]", clears values and definitions for
all symbols whose names match any of the string patterns form-i.

This suggests that Clear will "clear strings", as you put it, and so it does:

ClearAll [ f , x ];
f [ name_String ] := Clear [ name ] ;
x = 3 ;
f [ "x" ] ;
x (* now prints as "x, not "3" *)

(2) There are reasons to clear Strings rather than Symbols. A less
simple example of a function to Clear symbols might, for example, take
one or more string arguments from which it then constructs a list of
Symbols to be Cleared. For example, given "x", it might clear x2, x4,
x6, ... x100.

(3) I remain in the dark about why this example fails:

ClearAll [ f ] ;
SetAttributes [ f , HoldFirst ] ;
f[arg_] := ( Print["<", Unevaluated[arg], ">"];
   Clear [ ToString [ Unevaluated [ arg ] ] ] ) ;
x = 2;  (*assign a value to 'x' *)
f [ x ] ;  (* 'f' can print the symbol 'x' ! *)
x  (* but ' x' still has value '2' *) ;

It appears that Clear [ string ] works,
but Clear [ ToString [ Unevaluated [ symbol ] ] ] does not work.
Is a "String" not a "String Pattern" representing itself?
What mistake am I making?

-- James


On Thu, Feb 9, 2012 at 3:17 AM, Bob Hanlon <hanlonr357 at gmail.com> wrote:
>
> Clear[x];
> x
> x = 2
> Clear[x] (* you clear symbols not strings *)
> x
>
>
> x
>
> 2
>
> x
>
> ClearAll[f];
> SetAttributes[f, HoldFirst];
> f[arg_] := (Print[Unevaluated[arg]]; Clear[arg]);
> x = 2
> f[x]
> x
>
> 2
>
> x
>
> x
>
>
> Bob Hanlon
>
> On Thu, Feb 9, 2012 at 5:38 AM, James Stein <mathgroup at stein.org> wrote:
> > Before trying to encapsulate 'Clear' in a function, I try this:
> >
> > Clear [ x ] ;
> > x
> > x = 2
> > Clear [ ToString [ Unevaluated [ x ] ] ] ;
> > x
> >
> > And I expect to get three  lines of output:   x, 2, and x
> > But instead I get these three lines output:  x, 2 and 2.
> >
> > What do I misunderstand, or need to know?
> >
> > I observe that a function CAN obtain the name of a symbol passed to it:
> >
> > ClearAll [ f ] ;
> > SetAttributes [ f, HoldFirst ] ;
> > f [ arg_ ] := ( Print [ Unevaluated [ arg ] ] ;
> >  Clear [ ToString [ Unevaluated [ arg ] ] ] ) ;
> > x = 2; (* assign a value to  'x' *)
> > f [ x ] ;  (* 'f' can print the symbol 'x' ! *)
> > x  (* but 'x' still has value '2' ; the 'Clear' had no effect !? *)
> >
> > Similar problems with trying to call 'Set' from within a function....



  • Prev by Date: Re: ListInterpolate and missing values
  • Next by Date: Re: Something other than PlotStyle to change look of graphs
  • Previous by thread: Re: How to call 'Clear' from within a function?
  • Next by thread: Re: How to call 'Clear' from within a function?