Arrays start at 1. Just... no.
Both Smalltalk and APL use 1 based indices so I just find any claim of obvious aesthetic superiority on this issue a little hard to accept without some back up.
If speaking aesthetics the fact that the number of items in your array is equal to the position of the last index item in the array would seem aesthetically superior.
Arguably, one-based indexing is more closed aligned to mathematics tradition. That point about being easier to index the last element helps to iterate backwards over an array. With zero-based indexing, a backwards loop becomes for(i=N-1; i>=0; i--). Yuck.
local gindex = {}
setmetatable(_G, {__index = function(t,k)
local v = gindex[k]
if v == nil then
error("Bad read of global variable " .. tostring(k), 2)
else
return v
end
end, __newindex = function(t,k,v)
error("Bad write of global variable " .. tostring(k), 2)
end})
for k,v in pairs(_G) do
gindex[k] = v
rawset(_G, k, nil)
end