Re: EUREKA Re: Types in Mathematica, a practical example

*To*: mathgroup at smc.vnet.net*Subject*: [mg63198] Re: EUREKA Re: [mg62800] Types in Mathematica, a practical example*From*: Andrzej Kozlowski <akoz at mimuw.edu.pl>*Date*: Sun, 18 Dec 2005 07:34:35 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

I forgot one thing: how to deal with your original problem. In[1]:= a=Array[Unique[a]&,{2,2}] Out[1]= {{a$17,a$18},{a$19,a$20}} In[2]:= a-x/.Flatten[Thread/@Thread[a->x]] Out[2]= {{0,0},{0,0}} Seems to me a little simpler than with the HoldForm approach. Andrzej On 17 Dec 2005, at 13:48, Andrzej Kozlowski wrote: > If you feel really want do it in this sor of way, I suggest the > following approach: > > > x=Array[Unique[x]&,{2,2}] > > > {{x$23,x$24},{x$25,x$26}} > > etc. > > I think in this way you get all the benefits of your approach > without all the problems that will result from using HoldForm. > (Somebody might have suggested this already; I have not followed > all the suggestions carefully since I do not myself feel any need > for a solution to this problem.) > > Andrzej Kozlowski > > > > On 17 Dec 2005, at 08:16, Andrzej Kozlowski wrote: > >> >> On 17 Dec 2005, at 02:26, Ingolf Dahl wrote: >> >>> >>> >>> My suggestion to define a 2x2 list of undefined elements is the >>> following: >>> >>> x = {{HoldForm[x[[1,1]]], HoldForm[x[[1,2]]]}, {HoldForm[x[[2,1]]], >>> HoldForm[x[[2,2]]]}}; >> >> You really do love this typing business ;-) Why not: >> >> >> In[1]:= >> x = Array[HoldForm[x[[##1]]] & , >> {2, 2}] >> >> Out[1]= >> {{HoldForm[x[[1,1]]], >> HoldForm[x[[1,2]]]}, >> {HoldForm[x[[2,1]]], >> HoldForm[x[[2,2]]]}} >> >>> >>> Occasionally, when you have defined some of the undefined >>> elements, you may >>> convert to Input Form or have to apply ReleaseHold or >>> ReplaceAll[#,HoldForm[Part[a__]]:>Part[a]]& @ to get rid of the >>> invisible >>> HoldForm surrounding the indexed elements. For Set and SetDelayed >>> you can >>> get this automatically by the command >> >> Hm... have you really tried it: >> >> >> >> ReplaceAll[#,HoldForm[Part[a__]]:>Part[a]]& @x >> >> >> {{HoldForm[x[[1,1]]], >> HoldForm[x[[1,2]]]}, >> {3, HoldForm[x[[2,2]]]}} >> >> >>> >>> Unprotect[HoldForm]; HoldForm /: Set[ HoldForm[ Part[a__]],b_]:= >>> Set[ >>> Part[a],b]; HoldForm /: SetDelayed[ HoldForm[ Part[a__]],b_]:= >>> SetDelayed[ >>> Part[a],b]; >>> Protect[HoldForm]; >> >> Since I consider redefining basic built in functions as >> "unnecessary evil" I will stop at this. Personally I just can't >> see any point in all of this but of course this is just a >> personal opinion. Those who like or imagine it could be useful it >> can pursue this further. However, there is just one more thing to >> deal with: >> >> >> >>> ___________________________________________________________ >>> When I played with this, I came across the following: >>> >>> Assume, that the value of axxx is not defined. Then >>> >>> Hold[Part[axxx, 57, 62]] /. {axxx -> b} >>> >>> returns >>> >>> Hold[b[[57,62]]] >>> >>> but if we first assign any value to axxx, e.g. Indeterminate, we >>> instead >>> obtain >>> >>> Hold[axxx[[57,62]]] >>> >>> Can someone explain? >> >> This is pretty obvious and I am sure you can explain it yourself. >> However, since you asked .. >> >> If aaax has the value Intermediate then in >> >> ReplaceAll[Hold[Part[axxx, 57, 62]], {Rule[axxx, b]}] >> >> the second argument evaluates to Intermediate->b, so all you are >> doing is evaluating: >> >> Hold[Part[axxx, 57, 62]] /. {Intermediate -> b} >> >> Use instead >> >> >> Hold[axxx[[57,62]]] /. >> {HoldPattern[axxx] -> b} >> >> >> Hold[b[[57,62]]] >> >> >> >> >>> >>> And I wish everybody A Merry Christmas and A Happy New Year! >>> >> >> I fully agree with this! >> >> Andrzej Kozlowski >