Re: Bug with Sequence and Assignment by Part...

*To*: mathgroup at smc.vnet.net*Subject*: [mg121628] Re: Bug with Sequence and Assignment by Part...*From*: David Bailey <dave at removedbailey.co.uk>*Date*: Fri, 23 Sep 2011 03:42:32 -0400 (EDT)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <j5f6ai$q8a$1@smc.vnet.net>

On 22/09/2011 12:31, BernieTheJet wrote: > If one patches a list of items into a list using Sequence[], it > appears that Mathemaitca doesn't properly update the data structure: > > temp = Range[3]; > temp[[2]] = Sequence @@ {a, a, a}; > temp > > as expected : > -> {1, a, a, a, 3} > > FullForm[temp] > also looks right: > -> List[1,a,a,a,3] > > As does: > Length[temp] > -> 5 > > Ok, so far all is fine. But subsequent additions to the same place do > not increase the length of temp, as one might expect: > temp[[2]] = Sequence @@ {b, b, b}; > temp > FullForm[temp] > > -> {1, b, b, b, 3} > and -> List[1,b,b,b,3] > > And, despite the Length of temp being '5', in fact there is no way to > put anything into position '5' of temp: > > Length[temp] > -> 5 > temp[[5]] = Sequence @@ {c, c, c} > -> Set::partw: Part 5 of {1,Sequence[b,b,b],3} does not exist.>> > > Here we finally see what is going on, somewhere temp is being stored > as {1,Sequence[b,b,b],3}, but all the functions that go to request > info from it first perform the evaluation of Sequence hence returning > the expected results. > > One can force Mathematica to sort things out with the otherwise meaningless: > temp=temp > > Surely I am not the first to encounter this, and surely it constitutes > at least one bug, (and surely it is shouldn't be in Mathematica 8!). I mean, > it seems to me that FullForm and Length should also detect the > presence of Sequence and act differently than they do here. > > Bernard > Thanks for that really fascinating example! I must say, when I first encountered Sequence as I learned Mathematica, I was a bit stunned because it didn't seem to fit the style of the rest of the Mathematica language. I tend to feel that if Sequence does what you want, use it, but it will never be a completely 'normal' function! In your example, my guess is that there is some sort of efficiency issue here. If updating temp[[2]] could, in effect, change the rest of the temp array then the performance of updates of vectors might suffer. Overall, I am glad Mathematica does not hide all its sneaky functions! David Bailey http://www.dbaileyconsultancy.co.uk