这是一个问题,我一直很温和,一直没有找到答案.
不过我以为我至少可以问这个问题,也许有人可以解释.
基本上我使用语法糖来编写很多语言(使用C语法):
int main() { int a = 2; a += 3; // a=a+3 }
而在lua中= =没有定义,所以我必须写一个= 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不实施这种语法糖.
解决方法
这只是我的猜测,但是:
在单遍编译器中很难实现
Lua的字节码编译器被实现为一个立即生成代码的单遍递归下降解析器.它不解析为单独的AST结构,然后在第二遍转换为字节码.
这对语法和语义造成了一些限制.特别地,任何需要任意前瞻或前瞻性参考的东西在这个模型中真的很难支持.这意味着分配已经很难解析了.给定的东西:
foo.bar.baz = "value"
当您解析foo.bar.baz时,您不会意识到您实际上正在解析作业,直到您已经解析并为其生成代码为止.由于这一点,Lua的编译器具有很好的复杂性,只是为了处理作业.
支持自我分配会使这更加困难.就像是:
foo.bar.baz += "value"
需要翻译成:
foo.bar.baz = foo.bar.baz + "value"
但是在编译器命中=的时候,已经忘记了foo.bar.baz.这是可能的,但不容易.
它可能不会很好的语法
Lua实际上没有语法中的任何语句或行分隔符.空白被忽略,没有强制性的分号.你可以做:
io.write("one") io.write("two")
要么:
io.write("one") io.write("two")
而Lua也同样高兴.保持一个像这样明确的语法是棘手的.我不确定,但是自我分配的操作符可能会变得更加困难.
它不会很好的多重分配
Lua支持多个作业,如:
a,b,c = someFnThatReturnsThreeValues()
对我来说,如果你试图做什么会是什么意思呢?
a,c += someFnThatReturnsThreeValues()
你可以将自我分配运算符限制为单个作业,但是你刚刚添加了一个人们必须知道的奇怪的角落.
所有这一切,自我转让操作符对于解决上述问题非常有用.