Re: ToExpression
- To: mathgroup at smc.vnet.net
- Subject: [mg35825] Re: [mg35697] ToExpression
- From: Omega Consulting <omega_consulting at yahoo.com>
- Date: Fri, 2 Aug 2002 02:42:28 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
At 03:16 AM 7/26/2002, Heubach, Silvia wrote:
>Hi all,
>
>I have a problem with using the function ToExpression to make a string
>into an expression that can then be evaluated. Something goes wrong with
>the evaluation - when I type the same expression in "by hand", then it
>evaluates properly. Either I am totally off in my understanding of how
>ToExpression works, or there is a potential bug (I am using version
>4.0). Please reply to this email
>(sheubac at calstatela.edu) rather than to the mathgroup, as I am
>travelling and cannot subscribe to the mathgroup right now - it would
>make my mailbox overflow....:)
>
>Thanks for any tips on this!
>Silvia
>
>********************************
>
>i = {1, 0, 0}; j = {0, 1, 0}; k = {0, 0, 1}; zero = {0, 0, 0};
>a = {i, j, k}
>
>str1 = "(((..)(..))(..))"
>
>
>
>The function insertx is to convert this string of parentheses and dots
>into a cross product, where each dot represents a different variable,
>and the parentheses indicate the groupings of the cross product.
>
>
>
>insertx[str_] := Module[{foo = str, vars, n, pos},
> foo =
> StringReplace[
> foo, {")(" -> "),(", ".(" -> ".,(", ")." -> "),.", ".." ->
>".,."}];
> foo = StringReplace[foo, {")" -> "]", "(" -> "Cross["}];
> n = Length[StringPosition[foo, "."]];
> Do[pos = StringPosition[foo, "."][[1]];
> foo = StringReplacePart[foo, ToString[Slot[i]], pos]
> (*Print[foo]*) , {i, n}];
> ToExpression[foo]]
>
>
>
>The function properly converts the string into the associated cross
>product, but does not evaluate correctly. Checking whether what is
>returned by the function is still a string gives a false, and it should,
>as the function should return an expression. (the output is indented)
>
>insertx[str1]
>
> ((#1\[Cross]#2)\[Cross](#3\[Cross]#4))\[Cross](#5\[Cross]#6)
>
>insertx[str1] &[j, k, i, k, k, i]
>
> ((#1\[Cross]#2)\[Cross](#3\[Cross]#4))\[Cross](#5\[Cross]#6)
>
>StringQ[insertx[str1]]
>
> False
>
>
>
>Typing in the corresponding cross product "by hand" and evaluating it
>returns the correct result.
>
>
>
>Cross[Cross[Cross[#1, #2], Cross[#3, #4]], Cross[#5, #6]] &[j, k, i, k,
>k, i]
>
> {1, 0, 0}
>
>What is wrong??? I have spent many hours on trying to understand this,
>so either I am completely off or there is a bug.
This is an improper use of Slot. Instead, I would specify the vectors in
the definition. Then you can use the vectors with Part:
In[1]:=
insertx[str_][lst_] := Module[{foo = str, n, pos},
foo =
StringReplace[
foo, {")(" -> "),(", ".(" -> ".,(", ")." -> "),.", ".." ->
".,."}];
foo = StringReplace[foo, {")" -> "]", "(" -> "Cross["}];
n = Length[StringPosition[foo, "."]];
Do[pos = StringPosition[foo, "."][[1]];
foo = StringReplacePart[foo, ToString[lst[[i]]], pos]
(*Print[foo]*) , {i, n}];
ToExpression[foo]]
In[2]:=
insertx[str1][{j, k, i, k, k, i}]
Out[2]=
{1,0,0}
Or with a list operation like Fold:
In[3]:=
myinsertx[str_][ lst_] := Module[{foo = str},
foo =
StringReplace[
foo, {")(" -> "),(", ".(" -> ".,(", ")." -> "),.", ".." ->
".,."}];
foo = StringReplace[foo, {")" -> "]", "(" -> "Cross["}];
foo = Fold[replace,foo,lst];
ToExpression[foo]]
In[4]:=
replace[str_, item_]:=
Module[{pos},
pos=First[StringPosition[str,"."]];
StringReplacePart[str, ToString[item], pos]
]
In[5]:=
insertx[str1][ {j, k, i, k, k, i}]
Out[5]=
{1,0,0}
--------------------------------------------------------------
Omega Consulting
"The final answer to your Mathematica needs"
Spend less time searching and more time finding.
http://www.wz.com/internet/Mathematica.html