我是Lua编程的新手,并且正在阅读本文档:https://www.lua.org/spe.html。有人可以告诉我为什么在运行以下代码片段时出现以下错误吗?:
n=0 -- counter of temporary variables
T={} -- table of temporary variables
function arithfb(a,b,op)
local i=op .. "(" .. a.name .. "," .. b.name .. ")"
if T[i]==nil then -- expression not seen yet
n=n+1
T[i]=create("t"..n) -- save result in cache
print(T[i].name ..'='..i)
end
return T[i]
end
setfallback("arith",arithfb) -- set arithmetic fallback
function create(v) -- create symbolic variable
local t={name=v}
setglobal(v,t)
return t
end
create("a") create("b") create("c") create("z")
while 1 do -- read expressions
local s=read()
if (s==nil) then exit() end
dostring("E="..s) -- execute fake assignment
print(s.."="..E.name.."\n")
end
lua:parser.lua:14:尝试调用nil值(全局'setfallback') 堆栈回溯: parser.lua:14:在主要块中 [C]:在?
答案 0 :(得分:3)
您已经找到了非常老的Lua规范,可能是Lua2。在引入元表之前,您必须为特定操作分配全局后备功能,但是现在,元表允许您为以下操作定义本地后备功能:通过元表在具体表上执行的操作。
如果不确定所使用的解释器的版本,则应阅读Lua 5.3的当前文档或检查_VERSION
的值。
答案 1 :(得分:1)
该代码是针对Lua 2.1的,如该论文所述。它使用后备功能,此后功能已由元表取代。
这是在Lua 5.1+中运行的代码的化身:
local MT={}
local V={}
local N=0
local function var(name)
local t={name=name}
V[name]=t
_G[name]=t
return setmetatable(t,MT)
end
local function S(a)
if type(a)=="table" then return a.name else return a or 0 end
end
local function arithfb(a,b,op)
local i=op .. "(" .. S(a) .. "," .. S(b) .. ")"
if V[i]==nil then N=N+1; V[i]=var("t"..N,N); print(V[i].name ..'='..i) end
return V[i]
end
local t={"add", "sub", "mul", "div", "unm", "pow"}
for i,v in next,t do
MT["__"..v]=function (a,b) return arithfb(a,b,v) end
end
local function vars(s)
for x in string.gmatch(s,"(%w+)") do var(x) end
end
vars"a,b,c"
return (a*a+b*b)*(a*a-b*b)/(a*a+b*b+c)+(a*(b*b)*c)