【问题标题】:How assignments can start with an open parenthesis in Lua?在 Lua 中,作业如何以左括号开头?
【发布时间】:2022-10-29 16:46:32
【问题描述】:

在阅读Lua manual 时,我遇到了这一部分:


函数调用和赋值都可以以左括号开头。这种可能性导致 Lua 的语法有歧义。考虑以下片段:

a = b + c
(print or io.write)('done')

语法可以通过两种方式看到这个片段:

a = b + c(print or io.write)('done')
a = b + c; (print or io.write)('done')

从示例中我可以理解函数调用可以以左括号开头:

a = b + c(print or io.write)('done')
         ^

但即使思考了几个小时,我也无法弄清楚作业如何以左括号开头,以及它与上述示例(第二行)有何关系。

谁能给我解释清楚,用例子说明那句话的意思?

【问题讨论】:

    标签: lua manual


    【解决方案1】:

    看看The Complete Syntax of Lua

    赋值定义为

    varlist ‘=’ explist
    

    varlist 定义为

    varlist := var {‘,’ var}
    var := Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 
    prefixexp := var | ‘(’ exp ‘)’
    exp := prefixexp
    

    这与functioncall 相同,因为它可以以prefixexp 开头,而prefixexp 可以以左括号开头。

    functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 
    

    所以我们可以构建一个非常简单的例子:

    a = {}
    (a).b = false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 2021-12-02
      • 2021-06-13
      • 2011-08-29
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      相关资源
      最近更新 更多