当前位置 : 主页 > 网络编程 > lua >

Lua运算符,为什么不是=, – =等等定义?

来源:互联网 收集:自由互联 发布时间:2021-06-23
这是一个问题,我一直很温和,一直没有找到答案. 不过我以为我至少可以问这个问题,也许有人可以解释. 基本上我使用语法糖来编写很多语言(使用C语法): int main() { int a = 2; a += 3; // a=
这是一个问题,我一直很温和,一直没有找到答案.

不过我以为我至少可以问这个问题,也许有人可以解释.

基本上我使用语法糖来编写很多语言(使用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, b, c += someFnThatReturnsThreeValues()

你可以将自我分配运算符限制为单个作业,但是你刚刚添加了一个人们必须知道的奇怪的角落.

所有这一切,自我转让操作符对于解决上述问题非常有用.

网友评论