MathGroup Archive 1999

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

Search the Archive

Re: Scoping and named patterns

  • To: mathgroup at
  • Subject: [mg18173] Re: Scoping and named patterns
  • From: Dr Dan <drdanw at>
  • Date: Sat, 19 Jun 1999 23:54:32 -0400
  • Organization: - Share what you know. Learn what you don't.
  • References: <7kcjrn$>
  • Sender: owner-wri-mathgroup at

In article <7kcjrn$lql at>,
  Dr Dan <drdanw at> wrote:
> I am having trouble with name conflicts between global symbols and
> named patterns.
> This example from The Book works fine:
> In[1]:= f[a^b] /. f[x : _^n_] -> p[x, n]
> Out[1]= p[a^b, b]
> But if the symbols used as pattern names have values:
> In[3]:= n = 2; x = 3;
>         f[a^b] /. f[x : _^n_] -> p[x, n]
> Out[3]= p[3, 2]
> My usual favorite scoping structure, Module, doesn't help:
> In[4]:= Module[{x, n}, f[a^b] /. f[x : _^n_] -> p[x, n]]
> Out[4]= p[3, 2]
> This shows that the global symbol is used as the pattern name and not
> the symbol local to the scoping construct:
> In[5]:= Module[{x, n}, Clear[x, n]; f[a^b] /. f[x : _^n_] -> p[x, n]]
> Out[5]= p[3, 2]
> Since local symbols are ignored, it is necessary to use Block:
> In[6]:= Block[{x, n}, f[a^b] /. f[x : _^n_] -> p[x, n]]
> Out[6]= p[a^b, b]
> This looks like a bug to me.  If I use a symbol in a local context I
> expect the local symbol and never the global.  I am a little concerned
> that the pattern itself doesn't scope its pattern names, that I can
> make one seemingly small change in my notebook and my patterned
> replacements begin crashing.
> Any comments, or a better workaround than Block?

Just after posting the above message, I discovered that the Block
solution doesn't always work.  My original intent was to store a
complicated rule for use elsewhere in the notebook:

In[1]:= n = 2; x = 3;
In[2]:= r = Block[{x, n},  f[x : _^n_] -> p[x, n]];
        f[a^b] /. r
Out[3]= p[3, 2]

Oops.  Now my replacement is outside the block.  Then I stumbled upon
the correct solution (without knowing why it worked), using RuleDelayed:

In[4]:= r = f[x : _^n_] :> p[x, n];
        f[a^b] /. r
Out[5]= p[a^b, b]

This seems to be a robust solution.  Read the other postings in this
thread for a much better explanation than I can give.  Thank you for
the help.

Sent via
Share what you know. Learn what you don't.

  • Prev by Date: Re: How to plot more curves on one graph
  • Next by Date: Some problems with complex functions like Sqrt[z]
  • Previous by thread: Re: Scoping and named patterns
  • Next by thread: Re: Re: Scoping and named patterns