Я пытаюсь реализовать простую очередь FIFO в Lua, код следующим образом:LUA реализация очереди
dataQ = {}
dataQ.first = 0
dataQ.last = -1
dataQ.data = {}
function insert(q, val)
q.last = q.last + 1
q.data[q.last] = val
end
function remove(q)
if (q.first > q.last) then
rval = -1
else
print("remove: q.data[q.first]= ", q.data[q.first], " q.first= ", q.first)
local rval = q.data[q.first]
print("remove: rval= ", rval)
q.data[q.first] = nil -- to allow garbage collection
q.first = q.first + 1
print("remove: q.first= ", q.first)
end
return rval
end
insert(dataQ,"a")
insert(dataQ,"b")
insert(dataQ,"c")
for i,v in pairs(dataQ.data) do
print(i, v)
end
repeat
local x = remove(dataQ)
print("list item= ", x)
until (dataQ.first > dataQ.last)
Когда я загружаю скрипт в ESP8266 (через ESPlorer) я получаю следующую ошибку Lua переводчика:
LUA interpreter error detected!
stdin: 1: ')' expected near ']w([[ print("remove: rval= ", rval)]]);
Однако скрипт работает, и я получаю следующий результат:
1 b
2 c
0 a
remove: q.data[q.first]= a q.first= 0
remove: rval= nil
remove: q.first= 1
list item= nil
Очередь вставки функции приложения уши работают как ожидалось, но функция удаления очереди не является. Первый оператор печати lua в функции удаления показывает правильное ожидаемое значение для q.data [q.first], но после присвоения значения rval значение «nil» вместо ожидаемого «a»
Я думаю, что я я не понимаю фундаментальную концепцию lua здесь, но я не могу понять, что это такое.
См https://github.com/daurnimator/fifo.lua – daurnimator
@Amadan это * является * в источнике, середина 'remove' функции:' печати ("удалить: RVAL =", RVAL) '. –
Работает для меня с использованием ESPlorer 0.2.0-rc3 и недавнего NodeMCU из ветви 'dev'. Я имею в виду, что я не получаю ошибку «интерпретатор LUA». –