在数学环境中使用Lua求值表达式

我想写一个用于在数学环境中求值数学表达式的函数。下面是我的尝试。

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

print(mathEval(sin(0)))

这会报错,提示sin为nil,尽管环境已设置为math。我知道可以通过将全局环境设置为math来解决此问题。但我不想污染全局空间。我的要求非常简单,我想编写一个函数在本地数学环境中求值数学表达式。在Lua中能否轻松完成,而不污染全局空间?

点赞
用户1442917
用户1442917

是的,它可以完成,但是你需要传递函数的名称(和参数),因为现在你是在全局环境中调用函数,而在那里它没有被设置。

类似下面的代码可能起作用:

function mathEval(name, ...)
  local _ENV = math
  return _ENV[name](...)
end
print(mathEval("sin", 0))
2020-04-22 15:26:13
用户7396148
用户7396148

你可以将整个表达式转化为一个字符串,并使用 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

2020-04-22 16:53:19
用户107090
用户107090

你不需要一个叫做 mathEval 的函数:

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

这并不会污染全局空间,不会新创建全局变量。

2020-04-22 20:10:59