lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

Mea culpa!

First, thank you for your response. Second, your diagnosis was exactly correct -- making the change you suggested fixed the problem immediately. Third, you were also right that the code I sent was not the code that generated the problem I was asking about -- I had two versions I was working with, and I sent the wrong one. However, your suggestion did resolve the issue, and now the test method runs just fine. Hopefully, this will resolve the problem I am experiencing in my production code.

Thank you again,


Peter Cawley wrote:
That code shouldn't work with the latest version of Lua (5.1).
Specifically, the line:
for k,v in self do n[k] = v end
Uses a feature which was deprecated in 5.0, and has been removed in
5.1, and hence when executed, that line should be giving you this
line 14: attempt to call a table value
A version of that line changed to be compatible with Lua 5.1 is:
for k,v in pairs(self) do n[k] = v end
If instead of changing it, you commented out that line, then you would
get the error message which you stated:
line 80: attempt to call method 'pushright' (a nil value)

Also, the line numbers in your error message do not correlate with the
source file which you included - line 46 does not call pushright, nor
is it part of the test function.

On Sun, Sep 20, 2009 at 5:34 PM, Christopher Eykamp <> wrote:
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]: ?


Here is the code:

-- $Id: lists.lua,v 1.6 2001/01/13 22:04:18 doug Exp $
-- 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

function List:length ()
  return self.last - self.first + 1

function List:pushleft (value)
  local first = self.first - 1
  self.first = first
  self[first] = value

function List:pushright (value)
  local last = self.last + 1
  self.last = last
  self[last] = value

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

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

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

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
  return 1


-- Some tests

function test ()
  local SIZE = 10000
  -- create a list with elements 1..SIZE
  local l1 = List:new()
  for i=1,SIZE do
  -- 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
  -- remove each individual item from right side of l3 and
  -- append to right side of l2 (reversing list)
  while l3:length() > 0 do
  -- reverse l1 in place
  -- compare Li1 and Li2 for equality
  -- and return length of the list
  if not l1:equal(l2) then return nil
  else return l1:length()

N = tonumber((arg and arg[1])) or 1
for i=1, N do
  result = test()