静态类型 Lua。

我正在寻找一种在编译时进行类型检查的Lua前端编译器,但输出标准的Lua 5.1字节码(仅具有运行时类型)。我想要的是一定程度的静态、编译时句法分析和可选的类型检查,以便更早地检测出微不足道的错误。生成的字节码必须与使用标准LoadString()编译的现有Lua字节码相协调。

明确一下——任何差异只会发生在字节编译时。运行时,字节码将不知道在编译阶段发生了任何不同/异常的事情。

我心目中的想法听起来很像ActionScript;我甚至不介意输出Lua字节码的ActionScript编译器!

有人听说过这样的努力吗?我看到有一些关于使用MetaLua来做到这一点的参考资料,但是老实说,我不够聪明,看不懂他们的文档。

原文链接 https://stackoverflow.com/questions/813926

点赞
stackoverflow用户83871
stackoverflow用户83871

没有这样的东西。也许可以扩展MetaLua以实现这一点,但没有人这样做,而且据我所知,也没有计划这样做。Lua旨在成为一种动态语言,如果您想要一种静态类型的语言,请使用之一。

您实际上正在寻找的是类似于Java或C#的东西。在这种情况下,您可以使用像Lua.NET这样的项目将现有的Lua代码与C#集成。还有Java的Kahlua

2009-05-02 01:36:04
stackoverflow用户41661
stackoverflow用户41661

在2005年左右的夏天,我与一位非常聪明的本科生共同研究了一下为Lua做一些编译时类型推断的问题,可能需要使用注释进行辅助。这个问题非常难!(我的学生写了一篇简短的技术笔记,但它并不是为普通人流传的。)

如果我想解决你提出的问题,并且需要满足两个限制:它必须允许重要的静态类型检查,并且必须与标准字节码编译的Lua代码相互操作,我将从零开始设计一个新的语言来满足这两个限制。这将是相当大的工作,但相对于试图将类型系统加入Lua来说要容易得多。

2009-05-02 02:37:41
stackoverflow用户6236
stackoverflow用户6236

请查看这篇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写成大写

2009-05-02 06:18:41
stackoverflow用户3349649
stackoverflow用户3349649

有一篇来自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

2014-07-03 23:57:15
stackoverflow用户5490359
stackoverflow用户5490359

这个问题已经有六年了... 但是这里有一个新的答案: http://terralang.org/

Terra 是一个简单、静态类型、编译型的语言,类似于 C,并且使用手动内存管理。不同的是,Terra 被设计成与 Lua 交互操作。Terra 函数通过使用 terra 关键词创建成一等 Lua 值。需要时,它们会被 JIT 编译成机器码。

2015-10-26 17:42:55
stackoverflow用户2166700
stackoverflow用户2166700

还有一个 Ravi https://github.com/dibyendumajumdar/ravi

Ravi 编程语言是 Lua 5.3 的派生版本,具有有限的可选静态类型和基于 LLVM 和 libgccjit 的 JIT 编译器

我非常喜欢使用 Terra 进行编程(见上文)

2016-12-03 20:58:11
stackoverflow用户13357472
stackoverflow用户13357472

我推荐 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

2020-09-09 02:19:27