MathGroup Archive 2009

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

Search the Archive

Re: weird escaping problem with StringPattern inside Module[]

  • To: mathgroup at
  • Subject: [mg100860] Re: weird escaping problem with StringPattern inside Module[]
  • From: dh <dh at>
  • Date: Tue, 16 Jun 2009 21:52:59 -0400 (EDT)
  • References: <h12ggp$edj$>

Hi Roger,

to me, the mystery is that your rule works at all. From the manual:

"Symbols that occur as pattern names in lhs are treated as local to the 

rule. This is true when the symbols appear on the right-hand side of /; 

conditions in lhs, and when the symbols appear anywhere in rhs, even 

inside other scoping constructs. "

The problem seems to be that Mathematica does not always localize 

pattern variables. It does it only when it thinks it necessary.


Module[{pat, var = x},

  pat = "a" ~~ x_ ~~ "c" -> x


this gives: "a" ~~ x_ ~~ "c" -> x

on the other hand:

Module[{pat, var = x},

  pat = "a" ~~ x_ ~~ "c" -> var


gives: "a" ~~ x$_ ~~ "c" -> x

this will not work, but it makes sense. Giving the variable name in a 

variable, it is a good guess to assume that the user does not mean the 

pattern variable. I could live with this. However, unfortunately it is 

not consistently implemented. Consider:

var = x;

pat = "a" ~~ x_ ~~ "c" -> var

this gives: "a" ~~ x_ ~~ "c" -> x what is inconsistent compared to the 


I consider this a bug. It would be better when it would work like 

described in the manual. I think you should inform Wolfram about this. 

Maybe somebody from the group has something to say about this.


divisor wrote:

> Hello MathGroup:


> I am having a strange problem where my code works fine in a Notebook

> session but acts strangely inside a Module[]. I presume that this is

> some scoping problem that is currently beyond me.


> I know how Module[] takes local variables and adds "$nnn" or something

> to the variable. It is doing a similar thing to my string pattern and

> I have no idea how to "escape" this and disable this behavior.


> Any help you can provide is greatly appreciated.


> This code works as expected:


> parseVars = {abc, def};

> text0 = "the rain in spain stays mainly...";

> parsePattern = "the " ~~ abc__ ~~ " in " ~~ def__ ~~ " stays main" ->

> parseVars;

> Flatten@StringCases[text0, parsePattern]

>> {"rain", "spain"}

> Print["patt=", parsePattern]

>> patt=the ~~abc__~~ in ~~def__~~ stays main->{abc,def}



> This is the module containing the exact same logic:


> getWeather[inputStr_String] := Module[

>   {parseVars, parsePattern}

>   , parseVars = {abc, def};

>   parsePattern = "the " ~~ abc__ ~~ " in " ~~ def__ ~~ " stays main" -

>> parseVars;

>   Print["patt=", parsePattern];

>   Flatten@StringCases[inputStr, parsePattern]

>   ]


> This shows the symptom. Notice how the pattern vars are suffixed and

> hence do not match those in the rhs of StringCases[] with the result

> being all are "no match"!?!?!


> getWeather[text0]

>> patt=the ~~abc$__~~ in ~~def$__~~ stays main->{abc,def}

>> {abc, def}


> TIA.


> Regards..


> Roger Williams

> Franklin Laboratory


  • Prev by Date: Re: FITS format and Mathematica 6
  • Next by Date: Re: Re: Re: mergeSort with ReplaceRepeated
  • Previous by thread: Re: weird escaping problem with StringPattern inside Module[]
  • Next by thread: Re: Re: weird escaping problem with StringPattern inside