【问题标题】:Why is running 'setfallback' in lua giving an error为什么在lua中运行'setfallback'会出错
【发布时间】:2019-08-20 13:44:58
【问题描述】:

我是 Lua 编程的新手,一直在阅读此文档:https://www.lua.org/spe.html。有人可以告诉我为什么我在运行以下代码 sn-p 时收到以下错误吗?:

  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


    【解决方案1】:

    您已经设法找到了一个非常古老的 Lua 规范,可能是 Lua 2。在引入元表之前,您必须为特定操作分配一个全局后备函数,但现在元表允许您为通过元表对具体表执行的操作。

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

    【讨论】:

      【解决方案2】:

      如那篇论文中所述,该代码适用于 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)
      

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2022-01-17
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多