静态类型 Lua。
我正在寻找一种在编译时进行类型检查的Lua前端编译器,但输出标准的Lua 5.1字节码(仅具有运行时类型)。我想要的是一定程度的静态、编译时句法分析和可选的类型检查,以便更早地检测出微不足道的错误。生成的字节码必须与使用标准LoadString()编译的现有Lua字节码相协调。
明确一下——任何差异只会发生在字节编译时。运行时,字节码将不知道在编译阶段发生了任何不同/异常的事情。
我心目中的想法听起来很像ActionScript;我甚至不介意输出Lua字节码的ActionScript编译器!
有人听说过这样的努力吗?我看到有一些关于使用MetaLua来做到这一点的参考资料,但是老实说,我不够聪明,看不懂他们的文档。
原文链接 https://stackoverflow.com/questions/813926
在2005年左右的夏天,我与一位非常聪明的本科生共同研究了一下为Lua做一些编译时类型推断的问题,可能需要使用注释进行辅助。这个问题非常难!(我的学生写了一篇简短的技术笔记,但它并不是为普通人流传的。)
如果我想解决你提出的问题,并且需要满足两个限制:它必须允许重要的静态类型检查,并且必须与标准字节码编译的Lua代码相互操作,我将从零开始设计一个新的语言来满足这两个限制。这将是相当大的工作,但相对于试图将类型系统加入Lua来说要容易得多。
请查看这篇Metalua博客文章。
-{ extension "types" }
function sum (x :: list(number)) :: number
local acc :: number = 0
for i=1, #x do acc=acc+x[i] end
return acc
end
虽然看起来像是运行时的解决方案。
无论如何,如果您想扩展Lua语法,Metalua是首选工具,请随时在Metalua邮件列表中提出问题。
P.S. 请永远不要把Lua写成大写!
有一篇来自PUC-RIO的新论文 "Typed Lua: An Optional Type System for Lua" 刚刚在Dyla'14会议上发表。http://dl.acm.org/citation.cfm?id=2617553
该论文介绍了“Lua脚本语言的可选类型系统扩展—— Typed Lua 的初始设计”。现在仍在进展中,类型系统相对简单,尚未提供类型推断/类型检查工具。
关于基于Metalua的类型系统,来自Fabien的 Tidal Lock:Lua的可选静态类型检查和推断。http://lua-users.org/lists/lua-l/2013-02/msg00403.html。
这个问题已经有六年了... 但是这里有一个新的答案: http://terralang.org/
Terra 是一个简单、静态类型、编译型的语言,类似于 C,并且使用手动内存管理。不同的是,Terra 被设计成与 Lua 交互操作。Terra 函数通过使用 terra 关键词创建成一等 Lua 值。需要时,它们会被 JIT 编译成机器码。
还有一个 Ravi https://github.com/dibyendumajumdar/ravi
Ravi 编程语言是 Lua 5.3 的派生版本,具有有限的可选静态类型和基于 LLVM 和 libgccjit 的 JIT 编译器
我非常喜欢使用 Terra 进行编程(见上文)
我推荐 EmmyLua 这个 Intellij/VSCode 插件,它支持打字文档。我发现它的整体文档方法非常友好。同时感谢它的 IDE 支持,EmmyLua 还支持提示。
以下是 EmmyLua doc 的一个小片段:
--- @alias recipe_prototype any
--- @alias recipe_name string
--- @alias ingredient_name string
--- @class Coordinate
--- @field x number
--- @field y number
--- @class Entity
--- @field entity_number number unique identifier of entity
--- @field name string entity name
--- @field position Coordinate
--- @field direction any defines.direction.east/south/west/north
--- @class BlueprintSection
--- @field entities Entity[]
--- @field inlets number[] index of inlets in entities list
--- @field outlets number[] index of outlets in entities list
--- @type BlueprintSection
BlueprintSection = {}
--- @return BlueprintSection
function BlueprintSection.new()
--- ...
end
--- @param other BlueprintSection
--- @param xoff number optional, x-offset of the other section, default to width of self
--- @param yoff number optional, y-offset of the other section, default to 0
--- @return BlueprintSection new self
function BlueprintSection:concat(other, xoff, yoff)
-- ...
end
获取更多文档参考,请查阅 https://emmylua.github.io。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
没有这样的东西。也许可以扩展MetaLua以实现这一点,但没有人这样做,而且据我所知,也没有计划这样做。Lua旨在成为一种动态语言,如果您想要一种静态类型的语言,请使用之一。
您实际上正在寻找的是类似于Java或C#的东西。在这种情况下,您可以使用像Lua.NET这样的项目将现有的Lua代码与C#集成。还有Java的Kahlua。