数学环境下Lua中的求值表达式
我想写一个函数来计算数学环境中的数学表达式。这是我的尝试数学环境下Lua中的求值表达式,lua,environment-variables,environment,evaluation,Lua,Environment Variables,Environment,Evaluation,我想写一个函数来计算数学环境中的数学表达式。这是我的尝试 function mathEval(...) local _ENV = math return ... end print(mathEval(sin(0))) 这会给出sin为零的错误,尽管环境设置为math。我知道我可以通过将全球环境设置为数学来做到这一点。但我不想污染全球空间。我的要求相当简单。我想写一个函数来计算本地数学环境中的数学表达式。在lua中是否可以轻松完成而不污染全局空间?是的,可以完成,但需要传递函数名称(和参数
function mathEval(...)
local _ENV = math
return ...
end
print(mathEval(sin(0)))
这会给出sin为零的错误,尽管环境设置为math。我知道我可以通过将全球环境设置为数学来做到这一点。但我不想污染全球空间。我的要求相当简单。我想写一个函数来计算本地数学环境中的数学表达式。在lua中是否可以轻松完成而不污染全局空间?是的,可以完成,但需要传递函数名称(和参数),因为现在您正在全局环境中调用函数,而全局环境中没有设置函数 类似的方法可能会奏效:
function mathEval(name, ...)
local _ENV = math
return _ENV[name](...)
end
print(mathEval("sin", 0))
您可以将整个表达式设置为字符串,然后使用
load
执行表达式
function mathEval(exp)
return load("return " .. exp, exp, "t", math)()
end
print(mathEval("sin(0)"))
print(mathEval("sin(0)+cos(1)+2^2"))
LUA5.3中的输出
0.0
4.5403023058681
如果您使用的是5.1,则需要使用loadstring
加载功能的参考:
您不需要函数
mathEval
:
setmetatable(_ENV,{__index=math})
print(sin(rad(30)))
print(sqrt(2))
print(pi)
这不会污染全球空间,因为它不会创造新的全球空间。我负担不起。例如,我可能需要计算
mathEval(sin(0)+cos(1)+2^2)
然后您需要将其编写为mathEval(“sin(0)+cos(1)+2^2”)
并在math
环境(函数内部)的上下文中进行计算。您试图做的是不可能的(除非您将math
映射到调用mathEval的环境)。另一种选择是使用mathEval(function()return sin(0)+cos(1)+2^end)
并使用适当的环境调用该函数,但我认为它需要向它传递_ENV。在语句print(mathEval(sin(0))
中,实际上需要在全局环境(或文件的本地)中设置sin
。无法创建只在特定函数调用中使用的特殊上下文。感谢您提供此功能。在\u ENV,{{uuu index=math}
或\G,{uuu index=math}
之间有区别吗?两种方法都有效。我可能需要在不同的环境中计算相同的自由变量。在这种情况下可以做什么?@Maths89,\u ENV
是解析全局名称的当前环境。其默认值与\u G
相同,因此除非手动更改\u ENV
,否则不会有任何差异。