Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数学环境下Lua中的求值表达式_Lua_Environment Variables_Environment_Evaluation - Fatal编程技术网

数学环境下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
,否则不会有任何差异。