この第1版は、Lua 5.0用に書かれました。後のバージョンでは大まかに関連しているものの、いくつかの違いがあります。
第4版は Lua 5.3 を対象にしており、Amazon やその他の書店から入手できます。
この本を購入することで、Lua プロジェクトのサポートにも役立ちます。


11.4 – キューとダブルキュー

insertremove (tableライブラリから) を使用してキューを簡単に実装できますが、この実装は、構造が大きい場合にはあまりにも遅くなる可能性があります。より効率的な実装には、先頭要素と最後尾要素の2つのインデックスを使用します。

    function ListNew ()
      return {first = 0, last = -1}
    end
グローバル空間の汚染を避けるために、リストのすべての操作をテーブル内に定義します。適切にはListと呼ばれます。そのため、最後の例を以下のように書き直します。
    List = {}
    function List.new ()
      return {first = 0, last = -1}
    end
今や、両方の端に要素を挿入または削除して一定時間でできます。
    function List.pushleft (list, value)
      local first = list.first - 1
      list.first = first
      list[first] = value
    end
    
    function List.pushright (list, value)
      local last = list.last + 1
      list.last = last
      list[last] = value
    end
    
    function List.popleft (list)
      local first = list.first
      if first > list.last then error("list is empty") end
      local value = list[first]
      list[first] = nil        -- to allow garbage collection
      list.first = first + 1
      return value
    end
    
    function List.popright (list)
      local last = list.last
      if list.first > last then error("list is empty") end
      local value = list[last]
      list[last] = nil         -- to allow garbage collection
      list.last = last - 1
      return value
    end

この構造を厳密なキュー規律で使用して、pushrightpopleft のみを呼び出すと、firstlast は継続的に増加します。しかし、Luaの配列はテーブルで表現されるため、それらを1から20、あるいは16,777,216から16,777,236でインデックスできます。さらに、Luaは倍精度で数を表現するため、プログラムは200年間実行されて毎秒100万回挿入を行った後でも、オーバーフローの問題は発生しません。