Re: Scoping, named patterns, local vs global variables
- To: mathgroup at smc.vnet.net
- Subject: [mg44900] Re: Scoping, named patterns, local vs global variables
- From: drbob at bigfoot.com (Bobby R. Treat)
- Date: Sun, 7 Dec 2003 06:03:46 -0500 (EST)
- References: <bqmqus$r95$1@smc.vnet.net> <bqpncl$931$1@smc.vnet.net> <bqs95b$i1b$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
>>Yet, I still want the local scoping behavior implied by employment
of named pattern variables.
No problem. Just make sure x has no value, like this...
x =.;
Clear[f]
f[x_] = x^2
f[3]
?f
or, if x MUST have a value, and x MUST be the name of your pattern,
then...
x = 1;
Block[{x}, Clear[f]; f[x_] = x^2;]
f[3]
?f
or use a different pattern name:
x = 1;
Clear[f]
f[neverGlobal_] = neverGlobal^2
f[3]
?f
If you want to use SetDelayed but evaluate the RHS now, you have the
same three choices where the scope of x is concerned, starting with...
x =.
Clear[f]
f[x_] := Evaluate[Integrate[ProductLog[x], x]]
?f
There are situations where Remove[x] might be required rather than x=.
Bobby
frankeye at cox.net (Frank Iannarilli) wrote in message news:<bqs95b$i1b$1 at smc.vnet.net>...
> Oliver Friedrich <oliver.friedrich at tzm.de> wrote in message news:<bqpncl$931$1 at smc.vnet.net>...
> > frankeye at cox.net (Frank Iannarilli) wrote in
> > news:bqmqus$r95$1 at smc.vnet.net:
> >
> > > Summary punchline:
> > >
> > > x=1;
> > > f[x_]=x^2;
> > > In: f[3]
> > > Out: 1 (and not 3^2=9, since x is global)
> > >
> > >
> >
> > Hallo Frank,
> >
> > I'm wondering which version you use. I checked out your example above in
> > 4.2 and I've got the result which we all expect and that is according to
> > the desired behaviour written in the handbook, i.e the x as pattern name
> > is treated local.
> >
> > I'm keen on knowing the answer to your problem
> >
>
> Using 5.0, Windows2000.
>
>
> To respond to Jean-Michel and Bobby's point, yes, I understand that
> SetDelayed (:=) will behave in the manner I wish **as regarding**
> local scoping behavior of the named patterns (formal arguments).
>
> But there are times that I really want the immediate rhs evaluation
> offered by the Set (=) behavior, for example to avoid recomputing some
> "kernel" within the rhs upon repeated lhs evaluation. Yet, I still
> want the local scoping behavior implied by employment of named pattern
> variables. I tried to get both by doing:
>
> f[x_]:=Evaluate[rhs(x)]
>
> but evidently the Evaluate[] extinguishes the local scoping, i.e., the
> global value of x is substituted immediately into the rhs.
>
> I do like what The Book declares/implies regarding local scoping
> behavior for Set; otherwise, if I instead wanted the global value to
> override local scoping, why then would I bother to use the named
> pattern variable on the lhs and rather just do:
> f[x]=x^2;
> or
> f[_]=x^2;
>
>
> Thanks, all for your comments thus far.