local chupacabra = {} -- TODO: add the ability to push and pop arrays from the stack -- Parse a string into a list of tokens function chupacabra.tokenize(str) local tokens = {} for token in string.gmatch(str, "%S+") do table.insert(tokens, token) end return tokens end function chupacabra.evaluate(tokens, context) local stack = {} for _, token in ipairs(tokens) do if tonumber(token) then table.insert(stack, tonumber(token)) elseif token == "pop" then table.remove(stack) -- testing is fun elseif token == "+" then local b = table.remove(stack) local a = table.remove(stack) table.insert(stack, a + b) elseif token == "-" then local b = table.remove(stack) local a = table.remove(stack) table.insert(stack, a - b) elseif token == "*" then local b = table.remove(stack) local a = table.remove(stack) table.insert(stack, a * b) elseif token == "/" then local b = table.remove(stack) local a = table.remove(stack) table.insert(stack, a / b) elseif token == "map+" then -- If the token is "map+", pop an array from the stack, add 1 to each element, and push the result local a = table.remove(stack) for i, v in ipairs(a) do a[i] = v + 1 end table.insert(stack, a) elseif token == "map*" then -- If the token is "map*", pop an array from the stack, multiply each element by 2, and push the result local a = table.remove(stack) for i, v in ipairs(a) do a[i] = v * 2 end table.insert(stack, a) elseif token == "map-" then -- If the token is "map-", pop an array from the stack, subtract 1 from each element, and push the result local a = table.remove(stack) for i, v in ipairs(a) do a[i] = v - 1 end table.insert(stack, a) elseif token == "map/" then -- If the token is "map/", pop an array from the stack, divide each element by 2, and push the result local a = table.remove(stack) for i, v in ipairs(a) do a[i] = v / 2 end table.insert(stack, a) else error("invalid token: " .. token) end end return table.remove(stack) end function chupacabra.run(str, context) local tokens = chupacabra.tokenize(str) return chupacabra.evaluate(tokens, context) end return chupacabra