MathGroup Archive 2011

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

Search the Archive

Re: Difficulty with patterns

  • To: mathgroup at smc.vnet.net
  • Subject: [mg122298] Re: Difficulty with patterns
  • From: Bill Rowe <readnews at sbcglobal.net>
  • Date: Mon, 24 Oct 2011 05:13:21 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com

On 10/23/11 at 6:24 AM, Paul.McHale at excelitas.com (McHale, Paul)
wrote:

>Example 1 uses my old standby, the Table[] function.  Works fine.  I
>am attempting to get better with patterns, so I tried example 2 and
>3.  They work, but gives several errors about use of stringjoin
>needing strings.  What am I doing wrong?

>Error: StringJoin::string: String expected at position 1 in
>StringJoin[n].

>(* Load string from WolframAlpha  *) m
>WolframAlpha["usa",{{"LargestCities:CountryData",1},"ComputableData"
>},
>PodStates->{"LargestCities:CountryData__More","LargestCities:
>CountryData__More"}];

<snip>

>(* example 2 *)
>Clear[n,o,p,q];
>mNew=Cases[m, {{n_String,o_String,p_String},q_} -> { n <>  ", " <> o  <> ", " <>  p,q},Infinity ];
>Grid[mNew,Frame->All]

The problem with the above occurs when the replacement rule is
evaluated. It is evaluated immediately, At that time, n, o, and
p are symbols without assigned values. So, the effect is to
evaluate n <> ", " before n is defined to be a string which
produces the error message. You can avoid this problem by using
RuleDelayed (:>) instead of Rule (->). That is:

Clear[n,o,p,q];
mNew=Cases[m, {{n_String,o_String,p_String},q_} :> { n <>  ", "
<> o  <> ", " <>  p,q},Infinity ];
Grid[mNew,Frame->All]

Will do what you want without the error message. For what it is
worth, I would have done

mNew = m[[1, 2 ;;]]/.{a_List, b_Integer}:>{StringJoin@@Riffle[a,
{", ",", "}], b};
Grid[mNew,Frame->All]

to get the desired output




  • Prev by Date: Re: Creating Objects
  • Next by Date: Re: Full simplify problem
  • Previous by thread: Re: Difficulty with patterns
  • Next by thread: Re: Difficulty with patterns