Luau 是我们开发的新语言,您可以在https://luau-lang.org上了解更多内容。
下边界计算
编辑: 我近期发现这个功能还未完全上线。预计在本周晚些时间上线
编辑2: 测试版功能现已上线!未能按时上线,我们深表歉意!
编辑3: 我们需要暂时下线测试版功能,否则会导致程序崩溃。敬请期待!
Luau语言有一个常见问题,其工作方式主要是通过检查程序中的表达式,缩小可能阻止特定变量值的上边界。换句话说,每看到一个变量被使用时,就会从该变量的域中消除可能的值的集合。
在一些重要情况下,这样做并不会产生有利的结果。以此函数为例:
function find_first_if (vec, f)
for i, e in ipairs(vec) do
if f(e) then
return i
end
end
return nil
end
Luau语言从上到下扫描函数,首先看到行return i ,由此推断find_first_if必须返回至 i 类,即数字。
本来是没什么事的,但当return nil这一行出现时就出问题了,由于我们是在不断地收窄类型,因此从这行代码可以推出所得的函数的返回类型为nil。既然已经得出结论,函数一定返回至数字,Luau就会报告一个错误。
在这种情况下,我们实际上想做的是用这些返回语句推断函数返回类型的下边界。与其说“这个函数必须返回nil类型的值”,我们应该说“这个函数也可以返回至nil类型的值。”
下边界计算正好可以做到这一点。在未来Luau将为上述功能推断number?类型。
而这的确会带来一个不良后果:如果函数没有返回类型的注释,我们将不再在返回语句上报告类型错误。我们认为这是正常的平衡,但还会继续关注进一步确认。
下边界计算比我们一直开发的其他计算更大,风险也更大,因此我们在罗布乐思哦工作是中建立了一个名为试验Luau语言功能的测试功能来启用它们。
欢迎各位开发者去尝试这个新功能,并告知我们大家的想法!
已知漏洞
当启用下边界计算时,我们已知存在某些循环类型的漏洞。例如,以下是已知有问题的语句。
type T = {T?}? -- spuriously reduces to {nil}?
我们希望尽快解决这个问题。
现在,所有表字面量将生成无密封表
以前,创建密封表的唯一方法是使用字面上的空表。我们稍微放松了限制:由{}表达式创建的所有表在其创建的范围内都视为无密封表:
local T = {}
T.x = 5 -- OK
local V = {x=5}
V.y = 2 -- previously disallowed. Now OK.
function mkTable()
return {x = 5}
end
local U = mkTable()
U.y = 2 -- Still disallowed: U is sealed
其他修复
-
创建类型的多行字符串表示时,调整缩进和空白,让类型更易于读取。
-
一些小错误修复可自动完成
-
修复后访问表中不存在的属性会报告错误。
-
提升了function foo() → ReturnType错误代码的语法分析器性能(正确的代码为function foo(): ReturnType
-
改进了因错误使用function关键字来启动类型如 type T = function代码的解析错误
-
修复的一些小的崩溃,提升了性能
感谢!
特别感谢所有的开源贡献者: