lua setmetatable - ошибка = попытка вызвать глобальный setmetatable (нулевое значение)

avatar
sbrbot
9 августа 2021 в 01:49
174
0
1

Я создаю одно дополнение для проигрывателя VLC в LUA (5.1). Он должен быть как можно меньше, поэтому я хочу интегрировать все необходимые функции в один файл lua (я не хочу беспокоить пользователей дополнительными файлами модулей). Поэтому я хочу встроить некоторые функции из внешних модулей прямо в мой lua-файл.

Мне нужно несколько битовых функций из модуля numberlua: bxor(), band(), rshift(), lshift().

Исходный код в модуле numberlua выглядит следующим образом (уже сокращен, и это все, что мне нужно от этого модуля), и когда я использую его как модуль, он работает нормально, но когда я извлекаю эти (включая несколько связанных) функций из модуля и вставьте в мой файл lua (хорошо, M удалено). Я получил ошибку:

attempt to call global 'setmetatable' (a nil value)

Хотя setmetatable внутри модуля работает, если он извлечен, он не работает!

Код внутри модуля, который работает:

local M = {_TYPE='module', _NAME='bit.numberlua', _VERSION='0.3.1.20120131'}

local MOD = 2^32
local MODM = MOD-1

local function memoize(f)
  local mt = {}
  local t = setmetatable({}, mt)
  function mt:__index(k)
    local v = f(k); t[k] = v
    return v
  end
  return t
end

local function make_bitop_uncached(t, m)
  local function bitop(a, b)
    local res,p = 0,1
    while a ~= 0 and b ~= 0 do
      local am, bm = a%m, b%m
      res = res + t[am][bm]*p
      a = (a - am) / m
      b = (b - bm) / m
      p = p*m
    end
    res = res + (a+b)*p
    return res
  end
  return bitop
end

local function make_bitop(t)
  local op1 = make_bitop_uncached(t,2^1)
  local op2 = memoize(function(a)
    return memoize(function(b)
      return op1(a, b)
    end)
  end)
  return make_bitop_uncached(op2, 2^(t.n or 1))
end

M.bxor = make_bitop {[0]={[0]=0,[1]=1},[1]={[0]=1,[1]=0}, n=4}
local bxor = M.bxor

function M.band(a,b) return ((a+b) - bxor(a,b))/2 end
local band = M.band

function M.bor(a,b)  return MODM - band(MODM - a, MODM - b) end
local bor = M.bor

local lshift, rshift -- forward declare

function M.rshift(a,disp) -- Lua5.2 insipred
  if disp < 0 then return lshift(a,-disp) end
  return math.floor(a % 2^32 / 2^disp)
end
rshift = M.rshift

function M.lshift(a,disp) -- Lua5.2 inspired
  if disp < 0 then return rshift(a,-disp) end 
  return (a * 2^disp) % 2^32
end
lshift = M.lshift

return M

Поэтому я использую его из модуля lile:

local bit = require ("numberlua")

и у меня rshift типа bit.rshift()

Как встроить функции из модуля выше непосредственно в файл lua и использовать эти функции как локальные?

Источник
sbrbot
9 августа 2021 в 11:39
0

Аддон VLC можно найти на GitHub (github.com/sbrbot/vlc-titlovi). В более новой версии мне удалось интегрировать функции из библиотек zzlib и inflate-bit32 в мой файл lua, но не из модуля numberlua.

Ответы (0)