[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: magical site for working on common code
- From: Axel Kittenberger <axkibe@...>
- Date: Tue, 4 Jan 2011 11:48:55 +0100
This is a new topic as Reply on Quae's remark. Quae wrote:
> So... in lack of this magical site for working on common code, I
> submit for consideration a suitable array implementation:
Might this "magic site for working on common code" be exactly what we
might want for the "standard library"?
That is a website where you can quickly view through existing code if
a piece is useable for you, and then just require() that piece, since
you have a recent source ball of it installed? A website where the
code is very well documented? You know of any software package that
can function as such? Can git/svn be suitable for this or isn't it?
BTW: Can someone enlighten me on this bit.
> list_mt.__index = {
> insert = insert ;
> append = append ;
> remove = remove ;
> length = length ;
> unpack = unpack ;
> tostring = table.concat ;
> sort = table.sort ;
> }
Why is __index a table and not a function?
On Mon, Jan 3, 2011 at 1:40 AM, Quae Quack <quae@daurnimator.com> wrote:
> So... in lack of this magical site for working on common code, I
> submit for consideration a suitable array implementation:
>
> local list_mt = { }
>
> local table_pack = table.pack or function ( ... ) return { n = select
> ( "#" , ... ) , ... } end
>
> function list ( ... )
> return setmetatable ( table_pack ( ... ) , list_mt )
> end
>
> local function check_list ( l )
> return assert ( getmetatable ( l ) == list_mt , "Not a list" )
> end
>
> local function insert ( l , i , v )
> check_list ( l )
> local sz = #l
> local new_sz = sz + 1
> assert ( type ( i ) == "number" and i > 0 and i <= new_sz , "Invalid index" )
>
> for k = sz , i , -1 do
> rawset ( l , k + 1 , rawget ( l , k ) )
> end
> rawset ( l , i , v )
> l.n = new_sz
> return l
> end
>
> local function append ( l , ... )
> check_list ( l )
> local args = table_pack ( ... )
> local sz = #l
> for i = 1 , args.n do
> rawset ( l , sz + i , rawget ( args , i ) )
> end
> l.n = sz + args.n
> return l
> end
>
> local function remove ( l , i )
> check_list ( l )
> local sz = #l
> assert ( type ( i ) == "number" and i > 0 and i <= sz )
> local v = rawget ( l , i )
> for k = i , sz do
> rawset ( l , k , rawget ( l , k + 1 ) )
> end
> l.n = sz - 1
> return l
> end
>
> local function concat ( l1 , l2 )
> check_list ( l1 )
> check_list ( l2 )
> local r = list ( l1:unpack ( 1 , #l1 ) )
> r:append ( l2:unpack ( 1 , #l2 ) )
> return r
> end
>
> local function length ( l )
> check_list ( l )
> return rawget ( l , "n" )
> end
>
> list_mt.__index = {
> insert = insert ;
> append = append ;
> remove = remove ;
> length = length ;
> unpack = unpack ;
> tostring = table.concat ;
> sort = table.sort ;
> }
> list_mt.__len = length ;
> list_mt.__ipairs = function ( l )
> local sz = #l
> return function ( l , last_i )
> local i = last_i + 1
> if i > sz then return nil end
> return i , rawget ( l , i )
> end
> end ;
> list_mt.__pairs = list_mt.__ipairs
> list_mt.__newindex = function ( l , i , v )
> assert ( type ( i ) == "number" and i > 0 and i < #l + 1 )
> rawset ( l , i , v )
> end ;
> list_mt.__add = append
> list_mt.__sub = remove
> list_mt.__concat = concat
>
>