Оценка выражения в Lua в математической среде - PullRequest
3 голосов
/ 22 апреля 2020

Я хочу написать функцию для оценки математического выражения в математической среде. Вот моя попытка.

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

print(mathEval(sin(0)))

Это дает ошибку, что грех равен нулю, хотя окружение настроено на математику. Я знаю, что мог бы сделать это, настроив глобальную среду для математики. Но я не хочу загрязнять глобальное пространство. Мое требование довольно простое. Я хочу написать функцию для оценки математического выражения в местной математической среде. Может ли это быть легко сделано в lua, не загрязняя глобальное пространство?

Ответы [ 3 ]

3 голосов
/ 22 апреля 2020

Вы можете сделать все выражение строкой, а затем использовать 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

Вам необходимо использовать loadstring, если вы используете 5.1

Ссылки для load функции:

https://www.lua.org/manual/5.2/manual.html#pdf -нагрузка

3 голосов
/ 22 апреля 2020

Вам не нужна функция mathEval:

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

Это не загрязняет глобальное пространство в том смысле, что оно не создает новые глобалы.

1 голос
/ 22 апреля 2020

Да, это можно сделать, но вам нужно передать имя функции (и параметры), так как сейчас вы вызываете функцию в глобальной среде, где она не настроена.

Примерно так может работать:

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