skip to Main Content

I am seeing some unexpected behaviour when using a table as an array in pico8 lua when compared to regular PUC-Rio lua

If I run the following code using PUC-Rio lua5.4.4 (ubuntu)

local t={}
for i=1,10 do t[i] = i*10 end
t[2]=nil
t[4]=nil
t[6]=nil
t[8]=nil
print()
for i=1,#t do print(t[i]) end

I get the expected output

10
nil
30
nil
50
nil
70
nil
90
100

However if i run the same code with pico-8 I get:

10

This appears triggered only when I delete (ie set to nil) the t[8] element. if I comment out that line then I get the expected on pico8

10
nil
30
nil
50
nil
70
80
90
100

It appears, in pico8 lua, that the #t size of the array changes to 1 when the t[8] element is set to nil.

2

Answers


  1. Chosen as BEST ANSWER

    It seem that the size operator #t is just not well defined in lua in the presence of nil values.

    https://www.lua.org/pil/19.1.html

    "undefined behaviour" in a scripting language.. Nice.


  2. Both are expected results, the length operator # in lua returns a number n where t[n] ~= nil and t[n+1] == nil, if there are holes (nil value) inside, the result is undefined.

    To find the maximum numeric index, in lua 5.1 you can use table.maxn, in other versions you have to write one.

    table.maxn = function(t)
        local n = 0
        for k, v in pairs(t) do
            if type(k) == 'number' and k > n then
                n = k
            end
        end
        return n
    end
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search