Я пишу переводчик LSL в Lua, и у меня возникают всевозможные проблемы с реализацией увеличивающихся и уменьшающихся операторов.В LSL есть такие вещи, в которых используется обычный синтаксис C (x ++, x--, ++ x, --x), а Lua - нет.Просто для того, чтобы избежать массового набора текста, я называю такие операторы «созданиями».В приведенном ниже коде я буду использовать «...» для представления других частей выражения.
... x += 1 ...
Не работает, потому что Lua имеет только простое назначение.
... x = x + 1 ...
Не сработает, потому что это утверждение, и Lua не может использовать выражения в выражениях.LSL может использовать выражения в выражениях.
function preIncrement(x) x = x + 1; return x; end
... preIncrement(x) ...
Хотя он и обеспечивает правильное значение в выражении, Lua передается по значению для чисел, поэтому исходная переменная не изменяется.Если бы я мог заставить это действительно изменить переменную, тогда все хорошо.Взаимодействие с окружающей средой может быть не очень хорошей идеей, не знаю, что такое область действия x.Я думаю, что я исследую это дальше.Переводчик может выводить подробности области действия.
При условии, что вышеуказанная функция существует -
... x = preIncrement(x) ...
Не будет работать по причине "это утверждение".
Другие решения начинают получатьочень грязно.
x = preIncrement(x)
... x ...
Работает нормально, кроме случаев, когда оригинальный код LSL выглядит примерно так -
while (doOneThing(x++))
{
doOtherThing(x);
}
, который становится целой банкой червей.Использование таблиц в функции -
function preIncrement(x) x[1] = x[1] + 1; return x[1]; end
temp = {x}
... preincrement(temp) ...
x = temp[1]
Еще более беспорядочно и имеет те же проблемы.
Начиная с того, что мне, возможно, придется фактически анализировать окружающий код, а не делать простые переводы.чтобы разобраться, каким будет правильный способ реализации любого данного творения.У кого-нибудь есть простые идеи?