MathGroup Archive 2009

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

Search the Archive

Re: part assigned sequence behavior puzzling

  • To: mathgroup at smc.vnet.net
  • Subject: [mg105257] Re: part assigned sequence behavior puzzling
  • From: "Sjoerd C. de Vries" <sjoerd.c.devries at gmail.com>
  • Date: Wed, 25 Nov 2009 06:21:10 -0500 (EST)
  • References: <heimgd$58a$1@smc.vnet.net>

I don't think you're wrong. I was just as puzzled with this behaviour
as you. I'd say it's a bug. Just look at the following :

Using extra temporary variables works as expected:

In[283]:= tmp = Range[15];
tmp[[7]] = Sequence @@ Range[2];
tmp2 = tmp;
tmp2[[7]] = Sequence @@ Range[2];
tmp3 = tmp2;
tmp3[[7]] = Sequence @@ Range[2];
tmp3

Out[289]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}

Using different locations in tmp works as expected:

In[295]:= tmp = Range[15];
tmp[[3]] = Sequence @@ Range[2];
tmp[[5]] = Sequence @@ Range[2];
tmp[[7]] = Sequence @@ Range[2];
tmp

Out[299]= {1, 2, 1, 2, 4, 1, 2, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15}

Temporarily storing tmp somewhere else works as expected:

In[311]:= tmp = Range[15];
tmp[[7]] = Sequence @@ Range[2];
tmp2 = tmp;
tmp = 0;
tmp = tmp2;
tmp[[7]] = Sequence @@ Range[2];
tmp2 = tmp;
tmp = 0;
tmp = tmp2;
tmp[[7]] = Sequence @@ Range[2];
tmp

Out[321]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}

My original hypothesis of what happens here was that Mathematica
optimizes assignments and remembers what it last assigned to a
location in an array. If it is the same, it does nothing. This would
work for all elements except Sequence.

This hypothesis is falsified by the following tests in which I changed
the ranges:

In[392]:= tmp = Range[15];
tmp[[7]] = Sequence @@ Range[2];
tmp[[7]] = Sequence @@ Range[3];
tmp[[7]] = Sequence @@ Range[4];
tmp

Out[396]= {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15}

In[397]:= tmp = Range[15];
tmp[[7]] = Sequence @@ Range[4];
tmp[[7]] = Sequence @@ Range[3];
tmp[[7]] = Sequence @@ Range[2];
tmp

Out[401]= {1, 2, 3, 4, 5, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15}

As you can see, only the last range sticks.

A new hypothesis would be to assume that Mathematica stores lists as a
table of pointers to the list members and that a Sequence not causes
the list to get extra pointers but that the Sequence is still
invisible lurking there with a single pointer pointing to it. Copying
the array may flatten out this structure, so that every member now
gets his own pointer:

In[402]:= tmp = Range[15];
tmp[[7]] = Sequence @@ Range[2]; tmp = tmp;
tmp[[7]] = Sequence @@ Range[2]; tmp = tmp;
tmp[[7]] = Sequence @@ Range[2]; tmp = tmp;
tmp

Out[406]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}

This seems to confirm the hypothesis.

The problem seems to be in Set, as Part works OK:
In[476]:= tmp = Range[15];
tmp[[7]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]}
tmp[[8]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]}
tmp[[9]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]}
tmp

Out[477]= {1, 2, 8}

Out[478]= {1, 2, 1}

Out[479]= {1, 2, 1}

Out[480]= {1, 2, 3, 4, 5, 6, 1, 2, 1, 2, 1, 2, 10, 11, 12, 13, 14, 15}

Could you report this to support at wolfram.com?

Cheers -- Sjoerd

On Nov 25, 9:31 am, mkr <mileskra... at gmail.com> wrote:
> I am puzzled by the following behavior:
>
> tmp = Range[15]
> tmp[[7]] = Sequence @@ Range[2];
> tmp[[7]] = Sequence @@ Range[2];
> tmp[[7]] = Sequence @@ Range[2];
> tmp
>
> yields
>
> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
> {1, 2, 3, 4, 5, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> I would have expected the repeated assignment to have a repeated
> effect, thus obtaining
>
> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
> {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> Where/why am I wrong?



  • Prev by Date: Re: random walk visualization
  • Next by Date: Re: Bug associated with Graphics3D???
  • Previous by thread: part assigned sequence behavior puzzling
  • Next by thread: Re: part assigned sequence behavior puzzling