Re: weird escaping problem with StringPattern inside Module[]
- To: mathgroup at smc.vnet.net
- Subject: [mg100860] Re: weird escaping problem with StringPattern inside Module[]
- From: dh <dh at metrohm.com>
- Date: Tue, 16 Jun 2009 21:52:59 -0400 (EDT)
- References: <h12ggp$edj$1@smc.vnet.net>
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.
Consider:
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
foregoing.
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.
Daniel
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
>
- Follow-Ups:
- Re: weird escaping problem with StringPattern inside
- From: divisor <congruentialuminaire@yahoo.com>
- Re: Re: weird escaping problem with StringPattern inside
- From: DrMajorBob <btreat1@austin.rr.com>
- Re: weird escaping problem with StringPattern inside