私はLSLをLuaトランスレータに書き込んでいますが、インクリメント演算子とデクリメント演算子の実装にさまざまな問題があります。LSLには、構文(x ++、x-、++ x、-x)のような通常のCを使用するようなものがありますが、Luaにはありません。大量の入力を避けるために、私はこれらの種類の演算子を「クリーメント」と呼びます。以下のコードでは、式の他の部分を表すために「...」を使用します。
... x += 1 ...
動作しません。cozLuaには単純な割り当てしかありません。
... x = x + 1 ...
ステートメントであるcozは機能しません。また、Luaは式でステートメントを使用できません。LSLは、式でcrementsを使用できます。
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]
さらに厄介で、同じ問題があります。
単純な翻訳を行うのではなく、実際に周囲のコードを分析して、特定の要素を実装する正しい方法を整理する必要があるように見え始めました。誰か簡単なアイデアがありますか?