|
I'm trying to run some pretty basic code, and am getting an unexpected
and confusing error. I'm hoping that more experienced eyes can tell me
what's wrong. This is standard code that was previously published,
which I have not modified in any way. I am running the latest version
of Lua. Here is the error: C:\>lua listtest.lua lua: listtest.lua:46: attempt to call method 'pushright' (a nil value) stack traceback: listtest.lua:46: in function 'test' listtest.lua:72: in main chunk [C]: ? C:\> Here is the code: -- $Id: lists.lua,v 1.6 2001/01/13 22:04:18 doug Exp $
-- http://www.bagley.org/~doug/shootout/
-- implemented by: Roberto Ierusalimschy
--------------------------------------------------------------
-- List module
-- defines a prototipe for lists
--------------------------------------------------------------
List = {first = 0, last = -1}
function List:new ()
local n = {}
for k,v in self do n[k] = v end
return n
end
function List:length ()
return self.last - self.first + 1
end
function List:pushleft (value)
local first = self.first - 1
self.first = first
self[first] = value
end
function List:pushright (value)
local last = self.last + 1
self.last = last
self[last] = value
end
function List:popleft ()
local first = self.first
if first > self.last then error"list is empty" end
local value = self[first]
self[first] = nil -- to allow collection
self.first = first+1
return value
end
function List:popright ()
local last = self.last
if self.first > last then error"list is empty" end
local value = self[last]
self[last] = nil -- to allow collection
self.last = last-1
return value
end
function List:reverse ()
local i, j = self.first, self.last
while i<j do
self[i], self[j] = self[j], self[i]
i = i+1
j = j-1
end
end
function List:equal (otherlist)
if self:length() ~= otherlist:length() then return nil end
local diff = otherlist.first - self.first
for i1=self.first,self.last do
if self[i1] ~= otherlist[i1+diff] then return nil end
end
return 1
end
-----------------------------------------------------------
-----------------------------------------------------------
-- Some tests
function test ()
local SIZE = 10000
-- create a list with elements 1..SIZE
local l1 = List:new()
for i=1,SIZE do
l1:pushright(i)
end
-- creates a copy of l1
local l2 = l1:new()
-- remove each individual item from left side of l2 and
-- append to right side of l3 (preserving order)
local l3 = List:new()
while l2:length() > 0 do
l3:pushright(l2:popleft())
end
-- remove each individual item from right side of l3 and
-- append to right side of l2 (reversing list)
while l3:length() > 0 do
l2:pushright(l3:popright())
end
-- reverse l1 in place
l1:reverse()
-- compare Li1 and Li2 for equality
-- and return length of the list
if not l1:equal(l2) then return nil
else return l1:length()
end
end
N = tonumber((arg and arg[1])) or 1
for i=1, N do
result = test()
end
print(result)
|