Begin End 提案

lua-users home
wiki

这是一个我写下的正式提案。请告诉我你的想法,但请不要修改提案本身的文字。-- LeafStorm

这对于公共 wiki 页面来说不是一个合理的政策。请更改它或将内容移动到网络上的只读位置。--JohnBelmonte

摘要

这是一个为匿名、零参数函数(也称为“过程”)添加“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 核心进行最小的修改,使用过程的代码将像对待普通函数一样对待它们。

示例

这是一个我想到的例子。(当然,还有很多其他地方可以使用它。)

HTML 生成

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 代码以正常的等宽格式编写,以避免混淆语法高亮显示。

这是实际提案的结尾。

评论


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2009 年 10 月 3 日下午 5:14 GMT (差异)