在数学环境中评估Lua中的表达

时间:2020-04-22 15:18:08

标签: lua environment-variables environment evaluation

我想编写一个函数来评估数学环境中的数学表达式。这是我的尝试。

function mathEval(...)
 local _ENV = math
 return ...
end

print(mathEval(sin(0)))

尽管环境设置为数学,但这会给出错误为sin为零的错误。我知道我可以通过将全局环境设置为数学来做到这一点。但是我不想污染全球空间。我的要求很简单。我想编写一个函数来评估本地数学环境中的数学表达式。可以在lua中轻松完成而不污染全球空间吗?

3 个答案:

答案 0 :(得分:3)

您可以将整个表达式设为字符串,然后使用load执行该表达式。

function mathEval(exp)
  return load("return " .. exp, exp, "t", math)()
end

print(mathEval("sin(0)"))
print(mathEval("sin(0)+cos(1)+2^2"))

lua 5.3中的输出

0.0

4.5403023058681

如果使用5.1,则需要使用loadstring

load函数的引用:

https://www.lua.org/manual/5.2/manual.html#pdf-load

答案 1 :(得分:3)

您不需要功能mathEval

setmetatable(_ENV,{__index=math})
print(sin(rad(30)))
print(sqrt(2))
print(pi)

这不会污染全局空间,因为它不会创建新的全局空间。

答案 2 :(得分:1)

是的,可以做到,但是您需要传递函数的名称(和参数),因为现在您要在尚未设置函数的全局环境中调用该函数。

类似的事情可能起作用:

function mathEval(name, ...)
  local _ENV = math
  return _ENV[name](...)
end
print(mathEval("sin", 0))