Почему в lua запущена команда setfallback, выдающая ошибку - PullRequest
1 голос
/ 29 марта 2019

Я новичок в Lua Programming и читаю эту документацию: 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: попытка вызвать нулевое значение (глобальный 'setfallback') трассировка стека: parser.lua: 14: в основной части [C]: в?

Ответы [ 2 ]

3 голосов
/ 29 марта 2019

Вам удалось найти очень старую спецификацию Lua, возможно, Lua 2. До того, как были представлены метатаблицы, вам нужно было назначить глобальную резервную функцию для конкретной операции, но теперь метатаблицы позволяют вам определять локальный запасной вариант для операция, выполняемая на бетонных столах через метатаблицы.

Вам следует прочитать текущую документацию для Lua 5.3 или проверить значение _VERSION, если вы не уверены в том, какую версию интерпретатора вы используете.

1 голос
/ 30 марта 2019

Этот код предназначен для 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...