これは私が長い間少しイライラしていた質問ですが、答えを探す時間がありませんでした。
しかし、少なくとも質問して、誰かが説明してくれるかもしれないと思いました。
基本的に、私がこれまで扱ってきた多くの言語では、構文糖を利用して記述します (C++ の構文を使用)。
int main() {
int a = 2;
a += 3; // a=a+3
}
一方、lua では は+=
定義されていないため、 と記述する必要がありますがa=a+3
、これもすべて構文糖に関するものです。 などのより「意味のある」変数名を使用する場合、bleed_damage_over_time
次のように記述するのは面倒になってきます。
bleed_damage_over_time = bleed_damage_over_time + added_bleed_damage_over_time
の代わりに:
bleed_damage_over_time += added_bleed_damage_over_time
したがって、良い解決策がない場合にこれをどのように解決するかではなく、その場合はもちろんそれを聞きたいのですが、なぜ lua がこの構文糖を実装しないのかを知りたいのです。
ベストアンサー1
これは私の推測に過ぎませんが、
1. これをシングルパスコンパイラで実装するのは難しい
Lua のバイトコード コンパイラは、コードを即座に生成するシングル パスの再帰下降パーサーとして実装されています。別の AST 構造に解析して、2 番目のパスでそれをバイトコードに変換することはありません。
これにより、文法とセマンティクスにいくつかの制限が課せられます。特に、任意の先読みや前方参照を必要とするものは、このモデルでサポートするのが非常に困難です。つまり、代入の解析がすでに困難です。次のような場合を考えてみましょう。
foo.bar.baz = "value"
を解析しているときfoo.bar.baz
、すでに解析してコードが生成された後で を押すまで、実際に代入を解析していることに気づきません=
。このため、Lua のコンパイラーは代入の処理だけでもかなり複雑になっています。
自己割り当てをサポートすると、それがさらに難しくなります。次のようになります。
foo.bar.baz += "value"
翻訳する必要があるもの:
foo.bar.baz = foo.bar.baz + "value"
しかし、コンパイラが に到達した時点では=
、 はすでに忘れられていますfoo.bar.baz
。 可能ですが、簡単ではありません。
2. 文法的に正しくない可能性がある
Lua の文法には、実際には文や行の区切りはありません。空白は無視され、セミコロンは必須ではありません。次のようにすることができます。
io.write("one")
io.write("two")
または:
io.write("one") io.write("two")
そしてLuaはどちらでも同じように満足しています。そのような文法を明確に保つのは難しいです。よく分かりませんが、自己代入演算子5月それをもっと難しくします。
3. 多重代入には対応していない
Lua は次のような多重代入をサポートしています:
a, b, c = someFnThatReturnsThreeValues()
以下のことを実行しようとした場合、それが何を意味するのかは私には分かりません。
a, b, c += someFnThatReturnsThreeValues()
自己代入演算子を単一の代入に制限することもできますが、そうすると、人々が知っておく必要のある奇妙なコーナーケースが追加されることになります。
これらすべてを考慮すると、自己代入演算子が上記の問題に対処する価値があるほど有用であるかどうかはまったく明らかではありません。