Re: What is happening here?

• To: mathgroup at smc.vnet.net
• Subject: [mg22166] Re: What is happening here?
• From: "Allan Hayes" <hay at haystack.demon.co.uk>
• Date: Thu, 17 Feb 2000 01:23:55 -0500 (EST)
• Sender: owner-wri-mathgroup at wolfram.com

```Jordan,

With

vLarge = {1, 2};
authornames = {"PA", "HW"};

We get the contrast

Through[Hold[f["PA"], f["HW"]][vLarge]](*1*)

Hold[f["PA"][{1, 2}], f["HW"][{1, 2}]]

Through[FullForm[Hold @@ (f /@ authornames)][vLarge]](*2*)

Hold[f["PA"], f["HW"]][List[1, 2]]

The difference arrises from the behaviour of the "wrapper" FullForm.
The evaluation of (*2*) proceeds as follows

Through[FullForm[Hold @@ (f /@ authornames)][vLarge]]

Through[FullForm[Hold @@ (f /@ {"PA", "HW"})][vLarge]];

Through[FullForm[Hold @@ ({f["PA"], f["HW"]})][vLarge]]

Through[FullForm[Hold[f["PA"], f["HW"]]][vLarge]]         (*3*)

FullForm[Hold[f["PA"], f["HW"]]][vLarge]

FullForm[Hold[f["PA"], f["HW"]][{1, 2}]]

Hold[f["PA"], f["HW"]][List[1, 2]]

We can see the how the last expression displays

FullForm[Hold[f["PA"], f["HW"]][{1, 2}]]

Hold[f["PA"], f["HW"]][List[1, 2]]

The crucial point is the presence of the FullForm in (*3*) when Through is
evaluated.

FullForm  is a "wrapper" (\$OutputForms gives the list of them) and whenever
Wrapper[expr] is sent for display and for storing as a value of Out[n] for
some n, then Wrapper[expr] is displayed but *expr* is stored as the value of
Out[n], thus:

%

Hold[f["PA"], f["HW"]][{1, 2}]

This stripping off of the wrappers only occrurs at this final stage and is
only done then for wrappers that are not inside non-wrappers

A[FullForm[a^2]]

A[Power[a, 2]]

%

A[Power[a, 2]]

These difficulties often crop up with MatrixForm -compare

{{a}, {b}} + FullForm[{{c}, {d}}]

{{a}, {b}} + MatrixForm[{{c}, {d}}]

"Jordan Rosenthal" <jr at ece.gatech.edu> wrote in message
> Hi all,
>
> I finally had a chance to try and compare all the different methods people
> sent me for computing the matrix
>
>   ( 1 0 0 )
>   ( 2 1 0 )
>   ( 3 2 1 )
>   ( 0 3 2 )
>   ( 0 0 3 )
>
> from the vector {1,2,3} (using much larger vectors).  I am running into a
> strange problem that I can't explain.
>
> I started by creating a function for each contributer.  Here is an example
> for two of the defintions (picked arbitrarily for this example because
they
> were first and last in the alphabet):
>
> -------------------------------------------------------
> f["Paul Abbot"][v_?VectorQ] := Module[
> {n = Length[v]},
> NestList[RotateRight,
>         Range[2n - 1, 3n - 2]]]
> ]
>
> f["Hartmut Wolf"][v_?VectorQ] := With[{r = Length[v] - 1},
> Transpose[NestList[RotateRight, Join[v, Table[0, {r}]], r]]]
> -------------------------------------------------------
>
> Running the following code (based on a suggestion from Hartmut Wolf) works
> great:
>
> -------------------------------------------------------
> vLarge = Range[400];
>
> List @@ (Part[#, 1, 1] &) /@
>     Timing /@ Through[ Hold[f["Paul Abbot"], f["Hartmut Wolf"]][vLarge]]
>
>    {0.49 Null, 0.27 Null}
> -------------------------------------------------------
>
> This works great; it gives me a list of timings for the two methods.  But
> because I have a large list I wanted to instead run code like this (where
> authornames would be a larger vector):
>
> -------------------------------------------------------
> authornames = {"Paul Abbot", "Hartmut Wolf"};
>
> List @@ (Part[#, 1, 1] &) /@
>     Timing /@ Through[ FullForm[Hold @@ (f /@ authornames)][vLarge]]
>
>    {0. Null}
> -------------------------------------------------------
>
> but this doesn't work the same way.  So I tried to compare the difference
> between the two versions by checking the difference between the code I
> replaced and my code.  Shown below, the two expressions have the same
> FullForms and Attributes:
>
> -------------------------------------------------------
> expr1 = Hold[ f["Paul Abbot"], f["Hartmut Wolf"] ];
> expr2 = Hold @@ (f /@ authornames);
>
> FullForm[expr1]==FullForm[expr2]
>     True
>
> Attributes[expr1]==Attributes[expr2]
>    True
>
> expr1 == expr2
>     True
> -------------------------------------------------------
>
> If the two expression have the same FullForm and Attributes, why do I not
> get the same results if I substitute one for the other?
>
>
> Humbly perplexed,
>
> Jordan
>
>
>
>
>

```

• Prev by Date: Re: solving third order equation: bad result
• Next by Date: Re: sum of recursive fn: solving for n
• Previous by thread: Re: What is happening here?
• Next by thread: Re: ASCII ... plus new stuff