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: [mg124904] Re: How to call 'Clear' from within a function?
  • From: Bob Hanlon <hanlonr357 at gmail.com>
  • Date: Sat, 11 Feb 2012 06:39:20 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201202091038.FAA18317@smc.vnet.net>

I stand corrected. David Bailey's response answers your question.


Bob Hanlon

On Fri, Feb 10, 2012 at 5:54 AM, James Stein <mathgroup at stein.org> wrote:
> 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: Why does the order of down values come back?
  • Next by Date: Re: Locator-set Bezier curves mapped to 3D surface
  • Previous by thread: Re: How to call 'Clear' from within a function?
  • Next by thread: Re: How to call 'Clear' from within a function?