推荐一门 Lua 方言 Teal
在一些领域,Lua 使用非常的广泛,比如游戏、OpenResty server 、给其他语言嵌入动态能力的场景等等。
Lua 有什么问题
但是 Lua 是一门非常灵活的语言,和常见的 Python 和 JavaScript 等比还要灵活和简单,这就造成使用成本偏高的问题,比如
- 不区分 struct 、map 、数组等数据结构,一律都是 table,使用者很难看出来这个数据到底是什么内容
- 函数参数和返回值传递多了和少了都会默默的变成 nil 而不会报错
我们在给 Golang 加入动态能力的时候就遇到了这些问题,代码多了写起来很痛苦,经过一些搜索,我们发现了 Teal,使用了大半年了,给大家推荐下。
Teal 介绍
Teal 和 Lua 的关系就类似 TypeScript 和 JavaScript 的关系,支持给已有的库进行类型标记,最终是翻译为 Lua 去实际使用的。
类型标记可以写在 xx.d.tl 文件中,比如
local record os exit: function(number) end return os
在 Teal 中主要新增了 record、array 和 map 类型,更多的语言特性可以见文档 https://github.com/teal-language/tl/blob/master/docs/tutorial.md
代码样例
-- record 类似其他语言中的结构体 local record arg_t a: string b: string end -- key 为字符串,值为数字数组的字典 local m: {string: {number}} m["x"] = {1, 2, 3} -- 带类型定义的函数 local function add(a: number, b: number): number return a + b end
vscode 插件
Teal 有常见的编辑器插件,比如我一般是使用 vscode 进行开发,它的 vscode 插件最近经过社区大佬的努力,支持了简单的自动补全和类型提示功能,后续会逐渐的加强。详见 https://github.com/teal-language/vscode-teal
为啥选择 Teal
其实市面上还有一些 Lua 的方言,为啥选择 Teal 呢,原因如下
- 主要作者 https://github.com/hishamhm 也是 htop 、luarocks 等的作者,实力很强
- 最近半年社区发展迅速,深度用户有不少,issue 、feature 等处理的非常快
- 其他类似的项目在这里也有分析 https://github.com/teal-language/tl/blob/master/docs/other_projects.md 要不不维护了,要不就类似 Lua 不是真正的 Lua
- https://github.com/TypeScriptToLua/TypeScriptToLua 是一个将 TypeScript 翻译为 Lua 的项目,我没有深入使用过,这个方向可以很好的利用 ts 的生态,能省很多事情,但是我个人认为 ts 和 Lua 语法差异比较大,我更加倾向是 Lua with type 而不是变成一门新的语言
Teal 还存在什么问题
因为我们使用的比较早,前期存在一些检查不完善和 bug,我们就内部 fork 维护了一些 patch,希望是让 Teal 代码写起来更像是 Golang 。
随着社区的发展,有些更加严格的检查在官方版本中也逐渐支持了,我们的 patch 也越来越少。比如最近作者提了个新想法,支持 arg? 的形式传递可选参数 https://github.com/teal-language/tl/pull/366,如果这个 merge 了,那我们的 patch 就可以再去掉一部分了。
语言的基础设施比较初期,比如 vscode 插件,肯定不能和其他语言的 IDE 支持相比,但是也够用了(毕竟我们去年写 Teal 都没补全和提示的),比如格式化工具,比如文档生成工具等等。