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 emit(i) if V[i]==nil then N=N+1; V[i]=var("t"..N); print(V[i].name ..' = '..i) end return V[i] end local function arithfb(a,b,op) local i=op .. "(" .. S(a) .. "," .. S(b) .. ")" return emit(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 local function fun(name) return function (x) local i=name.. "(" .. S(x).. ")" return emit(i) end end local function sin(x) return fun("sin")(x) end local function exp(x) return fun("exp")(x) end vars"x" return x^2*sin(exp(x))-exp(sin(x^2-x))