Begin End 提案 |
|
这是一个为匿名、零参数函数(也称为“过程”)添加“begin/end”语法的提案。例如,这
begin print "Foo!" end
将有效地转换为
function () print "Foo!" end
这可以在 LuaFiveTwo 中添加,或者可能在 Six 中添加(尽管 Six 对于像这样相对较小的功能来说,是一个相当遥远的时限)。
对语法的精确修改可以表示为
proc ::= 'begin' block 'end' exp ::= nil | false | true | Number | String | `...� | function | proc | prefixexp | tableconstructor | exp binop exp | unop exp args ::= '(' [explist] ')' | tableconstructor | String | proc | function
(这增加了 Lua 5.1 参考手册中表达的语法。)“begin”关键字将被添加到关键字列表中,因此将无法作为标识符使用。
当遇到“过程”时,将创建一个具有零个参数的函数,并将该块作为函数体。传递给该函数的任何参数都将作为可变参数传递,可以通过 ... 表达式(以及 arg
表,如果该功能在实施此提案时仍然存在)访问。
对语法的另一个显著修改是能够将过程或匿名函数直接传递给函数,而无需括号,就像当前对表构造函数等操作一样。
当前可以生成类似过程的语法冗长且笨拙。
function () do_stuff() end
新语法将更容易阅读、更容易输入,并且对将 Lua 用作配置语言或 DSL 的人来说更容易。能够在不使用括号的情况下将函数和过程传递给函数调用将起到类似的作用。它只需要对 Lua 核心进行最小的修改,使用过程的代码将像对待普通函数一样对待它们。
这是一个我想到的例子。(当然,还有很多其他地方可以使用它。)
doc = html begin -- 'html' is a function in the local namespace head begin -- 'head' is automatically generated by the environment title "Hello, world!" end body begin h1 "Hello, world!" end end
在字节码级别,这将完全向后兼容 - 过程可以生成与 function () ... end
语法相同的字节码。
从语法上来说,这些更改的影响很小。唯一可能导致现有代码出现问题的语法添加是将begin
作为关键字。(其他语法添加在之前根本不可能实现,并且不会对当前代码造成问题。)但是,begin
并不是一个很好的标识符 - 在其他语言中,它作为关键字的使用已有先例,并且在可以使用begin
的情况下,start
通常更合适。
我最初考虑将start
用作关键字。但是,这样做存在重大问题。首先,它作为标识符的使用频率远高于begin
。其次,据我所知,start
从未在这种情况下使用过,而begin
在许多语言中都使用过。最后,begin
听起来更好,并且输入所需的字符数相同。
另一种方法是使用分隔符。使用大括号并不实用,因为它们已经被表格使用 - 在这种情况下,很难区分表格和代码块。方括号也存在类似的问题,因为它们很容易与长字符串分隔符混淆。而尖括号以前从未以这种方式使用过,可能会被误解为二元比较运算符。圆括号简直是荒谬的。而使用单词更符合 Lua 的风格。
本提案由LeafStorm撰写。
使用本提案中引入的语法的 Lua 代码以正常的等宽格式编写,以避免混淆语法高亮显示。
这是实际提案的结尾。