Re: named pattern variable scoped as global, should be local
- To: mathgroup at smc.vnet.net
- Subject: [mg56761] Re: [mg56696] named pattern variable scoped as global, should be local
- From: DrBob <drbob at bigfoot.com>
- Date: Thu, 5 May 2005 06:02:18 -0400 (EDT)
- References: <200505040433.AAA06165@smc.vnet.net>
- Reply-to: drbob at bigfoot.com
- Sender: owner-wri-mathgroup at wolfram.com
Confusion is predictable, if you use the same symbol for the Module local variable and the pattern variable.
> (* this returns 14! *)
> x = 7;
> Module[{x},{1, 2, 3} /. x_ -> 2x];
x in the pattern x_ has nothing to do with the local module variable x, so you have three different x variables -- global, local to the module, and local to the rule. x_ matches {1,2,3} and the right hand side is 2x (evaluated BEFORE the pattern variable has a value, so this is the module variable x, not the rule x). The Module returns 2x (x is undefined in the module) and popping out of the Module, x gets its global value.
In this example, the RHS of RuleDelayed is 2x, and it's evaluated AFTER the pattern variable has a value, so that's 2*{1,2,3}:
Module[{x},{1,2,3}/.x_:>2x]
{2,4,6}
Almost the same thing happens here, but for a different reason (because q and x are different symbols):
Module[{x},{1,2,3}/.q_->2q]
{2,4,6}
2q evaluates to 2q before the Rule is applied, q_ matches {1,2,3}, and 2q becomes 2*{1,2,3}.
Bobby
On Wed, 4 May 2005 00:33:07 -0400 (EDT), <leenewman at gmail.com> wrote:
> When using a named pattern variable within a module, it should be
> scoped locally within the pattern. However, this does not seem to work
> as advertised. For example, shouldn't the pattern variable x in the
> statements below be local to the pattern? Does anyone know whether
> this is a bug, or whether I am just missing something about the usage
> of variables in patterns/condition constructs?
>
> (* this returns 14! *)
> x = 7;
> Module[{x},{1, 2, 3} /. x_ -> 2x];
>
> (* this returns {2,4,6}, assuming q is not globally defined. *)
> Remove[q];
> Module[{q},{1, 2, 3} /. q_ -> 2q];
>
>
> Lee
>
>
>
>
--
DrBob at bigfoot.com
- References:
- named pattern variable scoped as global, should be local
- From: leenewman@gmail.com
- named pattern variable scoped as global, should be local