Я создаю одно дополнение для проигрывателя 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 и использовать эти функции как локальные?
Аддон VLC можно найти на GitHub (github.com/sbrbot/vlc-titlovi). В более новой версии мне удалось интегрировать функции из библиотек
zzlib
иinflate-bit32
в мой файл lua, но не из модуляnumberlua
.