[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: 'table' as fallback for tables
- From: Sean Conner <sean@...>
- Date: Sat, 25 Jun 2016 16:49:21 -0400
It was thus said that the Great Tim Hill once stated:
>
> Ignoring syntax and compatibility issues for a moment, what would you have
> if a table had an explicit, unambiguous, first-class array length?
>
> — No confusion over the meaning/behavior of ipairs().
> — # would always be meaningful for all tables.
> — table.pack() and table.unpack() would mirror each other exactly.
> — The awkward “.n” convention could be scrapped.
> — Arrays could contain nil values.
> — Lua could potentially use the declared length to optimize internal table structure.
> — Far fewer posts here on people not understanding #, sequences, and ipairs().
>
> Of course there are all sorts of issues; if an array has length 4 what
> does t[5] = 10 do? Should table.insert() automatically lengthen an array
> when appending? And others. But I really wonder if these issues are any
> worse than the current odd mix of sometimes using #, sometimes stopping at
> the first nil, and sometimes using “.n”.
An idea I had was to just keep track of the largest integer key seen and
treat that as the length of the array. It seemed to me like a no brainer
because of the structure of a table:
typedef struct Table {
...
unsigned int sizearray; /* size of 'array' array */
TValue *array; /* array part */
..
} Table;
and tables like { 1 , 2 , nil , nil , nil , 6 } would have a length of '6'.
But then the issue of sparse arrays and table.insert() and table.remove()
come into play. Follow along here ... I do:
t = { [15] = "first" }
Right now, in standard Lua, #t==0. With my thought experiment, #t=15. Next
table.insert(t,"second")
still works, because now the table is { [15] = "first" , [16] = "second" }
and all is fine, until
table.insert(t,1,"Ha ha! I cut in line!")
Items 15 and 16 are stored in the hash portion, not the array portion. Item
1 is (possibly?) stored in the array portion. Should we go through and
renumber 15 and 16 to 16 and 17? Or not? The same issue with
table.remove():
table.remove(t,13) -- remove the unlucky member
So it was a nice idea, but an utter failure in the actual world.
-spc (Darn practice! Always destroying beautiful theories!)
- References:
- Re: 'table' as fallback for tables, Philipp Janda
- Re: 'table' as fallback for tables, Roberto Ierusalimschy
- Re: 'table' as fallback for tables, Soni L.
- Re: 'table' as fallback for tables, Roberto Ierusalimschy
- Re: 'table' as fallback for tables, Soni L.
- Re: 'table' as fallback for tables, Dirk Laurie
- Re: 'table' as fallback for tables, Soni L.
- Re: 'table' as fallback for tables, Andrew Starks
- Re: 'table' as fallback for tables, Andrew Starks
- Re: 'table' as fallback for tables, Tim Hill