Этот код предназначен для 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)