在数学环境中计算 Lua 中的表达式
Evaluating expression in Lua in Mathematics Environment
我想在数学环境中编写一个函数来处理 evaluate 数学表达式。这是我的尝试。
function mathEval(...)
local _ENV = math
return ...
end
print(mathEval(sin(0)))
这给出了 sin 为 nil 的错误,尽管环境设置为数学。我知道我可以通过将全球环境设置为数学来做到这一点。但是我不想污染全局space。我的要求很简单。我想在本地数学环境中编写一个函数来 evaluate 数学表达式。可以在 lua 中轻松完成而不污染全局 space 吗?
是的,可以做到,但是你需要传递函数的名称(和参数),因为现在你是在全局环境中调用函数,它没有设置。
类似这样的方法可能有效:
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"))
输出为lua 5.3
0.0
4.5403023058681
如果您使用 5.1
,则需要使用 loadstring
load
函数的参考资料:
您不需要函数 mathEval
:
setmetatable(_ENV,{__index=math})
print(sin(rad(30)))
print(sqrt(2))
print(pi)
这不会污染全局变量 space,因为它不会创建新的全局变量。
我想在数学环境中编写一个函数来处理 evaluate 数学表达式。这是我的尝试。
function mathEval(...)
local _ENV = math
return ...
end
print(mathEval(sin(0)))
这给出了 sin 为 nil 的错误,尽管环境设置为数学。我知道我可以通过将全球环境设置为数学来做到这一点。但是我不想污染全局space。我的要求很简单。我想在本地数学环境中编写一个函数来 evaluate 数学表达式。可以在 lua 中轻松完成而不污染全局 space 吗?
是的,可以做到,但是你需要传递函数的名称(和参数),因为现在你是在全局环境中调用函数,它没有设置。
类似这样的方法可能有效:
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"))
输出为lua 5.3
0.0
4.5403023058681
如果您使用 5.1
,则需要使用loadstring
load
函数的参考资料:
您不需要函数 mathEval
:
setmetatable(_ENV,{__index=math})
print(sin(rad(30)))
print(sqrt(2))
print(pi)
这不会污染全局变量 space,因为它不会创建新的全局变量。