为什么在lua中运行“setfallback”会出现错误

为什么在lua中运行“setfallback”会出现错误,lua,Lua,我是Lua编程新手,一直在阅读以下文档:。有人能告诉我为什么在运行以下代码段时出现以下错误吗 n=0 -- counter of temporary variables T={} -- table of temporary variables function arithfb(a,b,op) local i=op .. "(" .. a.name .. "," .. b.

我是Lua编程新手,一直在阅读以下文档:。有人能告诉我为什么在运行以下代码段时出现以下错误吗

  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] :在?

中,您找到了一个非常古老的Lua规范,可能是Lua 2。在引入元表之前,您必须为特定操作分配全局回退函数,但现在元表允许您通过元表为在具体表上执行的操作定义本地回退


如果您不确定正在使用的解释器的版本,您应该阅读当前文档或检查_VERSION的值。

您已经找到了非常旧的Lua规范,可能是Lua 2。在引入元表之前,您必须为特定操作分配全局回退函数,但现在元表允许您通过元表为在具体表上执行的操作定义本地回退


如果您不确定正在使用的解释器的版本,您应该阅读当前文档,或者检查_VERSION的值。

该文件中提到的代码是针对Lua 2.1的。它使用了回退,这些回退后来被元表所取代

下面是在Lua5.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)

正如那篇文章中提到的,该代码是为Lua2.1编写的。它使用了回退,这些回退后来被元表所取代

下面是在Lua5.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)