2026/9/13 1:52:48

Gleam v1.11.0 发布解读:布尔 assert、dev 开发入口与更智能的编译警告

Gleam v1.11.0 发布解读:布尔 assert、dev 开发入口与更智能的编译警告 Gleam v1.11.0 发布解读布尔 assert、dev 开发入口与更智能的编译警告【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam导读Gleam 是一门构建类型安全、可扩展系统的友好编程语言。v1.11.02025-06-02 发布是其 1.11 系列正式版本在此之前经历了 rc12025-05-15与 rc22025-05-29两个候选版本。本篇文章以 changelog/v1.11.md 为骨架结合仓库源码compiler-core、compiler-cli、language-server等逐项剖析该版本在编译器、构建工具、语言服务器、格式化器四个层面的核心变化。读完你将掌握布尔assert断言的新写法与自定义 panic 消息、gleam dev与dev/目录的用法、位数组截断与不可达 case 分支等新警告的触发条件与含义以及语言服务器一系列代码动作code action的实战价值。一、编译器新的断言方式与更聪明的警告1.1assert可以直接断言布尔表达式在 v1.11 之前assert主要用于模式匹配断言如let assert Ok(_) ...。本版本新增能力assert关键字可以直接作用于一个布尔表达式。若运行时表达式的值为False程序会以Assertion failed信息 panic并附带被断言表达式的信息pub fn ok_error_test() { assert result.is_ok(Ok(10)) assert result.is_error(Error(Some error)) assert Ok(1) ! Error(1) assert result.is_error(Ok(42)) // panic: Assertion failed }也可以使用as提供自定义 panic 消息为断言附加额外上下文pub fn identity_test() { assert function.identity(True) as Identity of True should never be False }这与 v1.10 中“let assert断言已被推断出具体变体的值会触发 always crash 警告”一脉相承——v1.11 把断言能力从模式匹配进一步扩展到任意布尔条件。在源码层面运行时失败消息统一由RuntimeErrorKind::Assert产生Assertion failed.见 compiler-core/src/erlang.rsJavaScript 目标同样输出Assertion failed.见 compiler-core/src/javascript/expression.rs。1.2 不可达 case 分支位数组模式也能识别编译器现在能够识别部分位数组bit array模式分支是否不可达。例如case payload { first_byte, _:bits - first_byte 1, _:bits - 1 _ - 0 }会产生如下警告warning: Unreachable case clause ┌─ /src/bit_array.gleam:4:5 │ 4 │ 1, _:bits - 1 │ ^^^^^^^^^^^^^^^^^^ This case clause cannot be reached as a previous clause matches the same values. Hint: It can be safely removed.这属于穷尽性/可达性分析exhaustiveness的增强相关的模式匹配与不可达模式判定逻辑位于 compiler-core/src/exhaustiveness.rs 及 compiler-core/src/exhaustiveness/missing_patterns.rs。同时修复了一个相关缺陷当某个case分支同时匹配多个备选模式alternative patterns时之前编译器可能不会正确报告不可达警告。提醒1, _:bits之所以不可达是因为前一个分支first_byte, _:bits已经覆盖了任意首字节的位序列。编译器是基于模式之间的包含关系静态推断的。1.3 位数组整型字面量截断警告当编译器能够确定一个整型位段int segment的字面量会被截断时会发出警告。例如258产生warning: Truncated bit array segment ┌─ /src/main.gleam:4:5 │ 4 │ 258 │ ^^^ You can safely replace this with 2 This segment is 1 byte long, but 258 doesnt fit in that many bytes. It would be truncated by taking its first byte, resulting in the value 2.在类型检查层该警告由Warning::BitArrayTruncatedSegment体系支撑仓库测试快照中记录了多种截断场景例如bit_array_truncated_segment.snap、bit_array_negative_truncated_segment.snap、bit_array_truncated_segment_in_bytes.snap等见 compiler-core/src/type_/tests/snapshots/ 下的warnings系列。与之配套编译器还修复并强化了位数组相关的多项行为拒绝大小为零或负数的位数组段模式此前会导致编译器崩溃let assert中的位数组模式内引用更早的段时Erlang 目标此前会生成无效代码已修复赋值模式出现在位数组模式内时此前类型检查会崩溃已修复位数组段size选项中使用管道运算符时Erlang 目标会生成无效代码已修复JavaScript 目标下位数组模式匹配未正确检查数组大小已修复JavaScript 目标下零长度位数组段在case中永远无法匹配已修复使用不同模式中的变量于位数组模式内会被允许但生成无效 Erlang 代码已修复。1.4 无副作用调用的返回值未使用警告编译器现在会对“调用了一个无副作用函数但未使用其返回值”的情况发出警告pub fn main() { add(1, 2) add(3, 4) }产生warning: Unused value ┌─ /src/main.gleam:4:3 │ 4 │ add(1, 2) │ ^^^^^^^^^ This value is never used This expression computes a value without any side effects, but then the value isnt used at all. You might want to assign it to a variable, or delete the expression entirely if its not needed.该警告在类型检查阶段产生对应Warning::UnusedValue定义与诊断渲染见 compiler-core/src/warning.rs。compiler-core/src/type_/tests/snapshots/下包含大量相关测试快照如unused_pure_function.snap、pure_pipeline_raises_warning.snap、unused_record_access_raises_a_warning.snap等覆盖了管道、记录访问、模块选择、case 表达式等各类纯表达式场景。1.5 穷尽性错误消息现在包含字段标签当一个case表达式不穷尽inexhaustive时错误消息现在会包含记录字段标签方便定位缺失的模式pub type Person { Person(name: String, age: Int) } pub fn classify(person: Person) { case person { Person(name: John, age: 27) - todo Person(name: _, age: 42) - todo } }产生error: Inexhaustive patterns ┌─ /src/main.gleam:6:3 │ 6 │ ╭ case person { 7 │ │ Person(name: John, age: 27) - todo 8 │ │ Person(name: _, age: 42) - todo 9 │ │ } │ ╰───^ This case expression does not have a pattern for all possible values. If it is run on one of the values without a pattern then it will crash. The missing patterns are: Person(name:, age:)1.6 更友好的类型元数arity错误消息类型参数数量使用错误时错误消息被显著改进。例如type Wibble(a) type Wobble { Wobble(Wibble) }产生error: Incorrect arity ┌─ /src/one/two.gleam:5:10 │ 5 │ Wobble(Wibble) │ ^^^^^^ Expected 1 type argument, got 0 Wibble requires 1 type argument but none where provided.1.7 更高效的代码生成与容错分析本版本在代码生成与类型检查的健壮性上有系统性提升JavaScript 模式匹配代码生成优化模式匹配生成的检查尽可能少效率更高Erlang 目标let assert代码生成优化生成更高效的代码消除无用模式变量的多余代码不再为未使用的模式变量生成冗余代码容错分析fault tolerant扩展列表、元组、取反运算符、panic、echo、todo、二元运算符、函数参数以及自定义类型模式的类型检查都不再因遇到第一个错误而停止从而在一次编译中报告尽可能多的错误相关类型检查逻辑位于 compiler-core/src/type_/expression.rsJavaScript 位数组支持 UTF-16 / UTF-32 字符串段导入未使用警告合并当某个带非限定类型与值的导入整体未使用时只对整条导入发一次警告而不是逐项警告。二、构建工具dev/目录与gleam dev命令2.1 新增dev目录与gleam devv1.11 为构建工具引入了新的模块目录约定与test目录类似dev目录只用于开发期代码。对应地新增了 CLI 命令gleam dev它运行$PACKAGE_dev模块用于执行开发入口点。从源码看gleam run的模块选择逻辑中已经包含了三种来源见 compiler-cli/src/run.rslet module module.unwrap_or(match which { Which::Src root_config.name.to_string(), Which::Test format!({}_test, root_config.name), Which::Dev format!({}_dev, root_config.name), });并且run.rs的模块路径解析也支持dev/前缀见 compiler-cli/src/run.rs前缀列表为[src/, test/, dev/]。在test/running_modules/dev/目录下有对应的测试项目如module_dev.gleam、module_in_dev.gleam、wrong_dev_arity.gleam等用于验证开发入口模块的运行行为。dev目录与test目录一样仅用于开发期代码不会被作为正式依赖对外暴露适合放置调试脚本、本地演示程序等非发布内容。2.2 文档生成质量提升保留源码中的类型变量名生成文档时函数签名中的类型变量使用源码中的原名而不是统一重命名为a、b。例如pub fn from_list(entries: List(#(key, value))) - Dict(key, value) { ... }以前渲染为List(#(a, b)) - Dict(a, b)现在渲染为List(#(key, value)) - Dict(key, value)。跨模块类型带模块限定符文档中来自其他模块的类型会以模块限定形式渲染悬停可显示模块名。例如import gleam/dynamic/decode pub fn something_decoder() - decode.Decoder(Something) { ... }悬停在decode.Decoder上会显示gleam/dynamic/decode.{type Decoder}。文档中渲染的类型还会链接到对应的文档页面。2.3 其他构建工具改进Erlang 发布包入口脚本erlang-shipment的 POSIX 入口脚本增加exec语句使 Erlang 进程替换 shell 进程从而在部署时能正确接收信号对应模板 compiler-cli/templates/erlang-shipment-entrypoint.sh 与 compiler-cli/templates/erlang-shipment-entrypoint.ps1弃用环境变量警告增强打印弃用环境变量警告时提供额外信息gleam add自依赖报错尝试把包添加为自身的依赖会报错Gleam/Erlang 文件冲突检测编译包时若存在名称冲突的 Gleam 与 Erlang 文件构建工具会报错主函数为私有函数时不再运行修复了构建工具试图运行主函数为私有的模块的问题。三、语言服务器更智能的代码动作与补全3.1 “移除 echo”代码动作连字面量一起清理在 v1.10 中语言服务器已经支持“移除模块内所有echo”的代码动作v1.11 的 rc2 进一步强化移除echo语句时被echo打印的纯字面量表达式也会一并移除。例如pub fn main() { echo Before do_complex_stuff() echo After do_something_else() }将变成pub fn main() { do_complex_stuff() do_something_else() }调试打印不再需要时可以一键清理干净。3.2 补全标签已输入部分标签后的自动补全例如在Person(n|)中语言服务器会提供name:与number:补全常量定义的悬停、自动补全与跳转定义。3.3 新增与改进的代码动作为模式补充缺失标签代码动作“为函数补全缺失标签”现在也适用于模式let Person(age:) person变成let Person(age:, name:, job:) person为case补全缺失模式时包含标签生成的缺失模式会带上字段标签如Person(name:, age:) - todo从错误代码生成新的变体当代码引用了尚不存在的构造器如UserPressedButton时代码动作可将其自动加入对应pub typepub type Msg { ServerSentResponse(Json) UserPressedButton }移除未使用的导入值与类型import a_module.{type Unused, unused, used}触发后变为import a_module.{used}“生成函数”命名更智能基于调用处传入的标签与变量名来生成参数名。例如对remove(each: number, in: list)生成fn remove(each number: Int, in list: List(Int)) - List(Int) { todo }JSON 编码函数改名由代码动作生成的 JSON 编码函数命名为$TYPENAME_to_json替代原来的encode_$TYPENAME消除与编码为其他格式的函数的歧义也更便于通过搜索发现实现位于 language-server/src/code_action.rs。3.4 相关缺陷修复语言服务器在 v1.11 修复了一批会导致无效代码或错误行为的缺陷包括在常量字符串内提供补全、在变量不在作用域时提供局部变量补全、“填充缺失标签”生成无效代码、“转换为 use”作用于带标签参数调用时生成无效代码、某些代码动作在包含多字节 UTF-8 字符的文件中生成无效代码、LSP 范围在多字节字符文件中的偏移错误、重命名与标签简写语法组合时生成无效代码、局部变量遮蔽非限定模块函数时被错误覆盖、case表达式出现在自定义 panic 消息中时在 JavaScript 目标编译为无效语法、数字中零后跟下划线在 JavaScript 目标编译为无效语法等。3.5 测试验证语言服务器相关的测试集中在 language-server/src/tests/ 下包括completion.rs、code_action.rs对应action.rs测试模块、definition.rs、rename.rs等并配以snapshots/目录中 1500 个快照文件可据此验证补全、代码动作与跨模块功能的预期输出。四、格式化器与安装4.1 格式化器改进了echo后跟长二元表达式时的格式化见 format/src/tests/echo.rs 相关测试。4.2 安装现在提供 Windows ARM64 预编译二进制。五、值得注意的缺陷修复汇总除上文已穿插说明的修复外v1.11 还包含以下要点管道运算符在assert右侧在 JavaScript 目标会生成无效代码已修复不必要的断言警告误报编译器有时会误报“断言不必要因为只断言了字面量”已修复“生成函数”代码动作使用内部变量名_capture已修复大量字段的类型构造器在文档中格式错误已修复记录字段名为x0时 JavaScript 目标生成无效代码已修复JavaScript 异常有时缺少函数名元数据已修复不穷尽case的缺失模式包含当前模块不可见的 opaque 类型构造器已修复let assert在元组模式内包含位数组模式时 JavaScript 目标崩溃已修复Hex 依赖替换为同名 Git 依赖时构建失败已修复更新 Git 依赖 remote URL 未同步到本地依赖导致缓存问题已修复测试模块缺失主函数的错误消息措辞不当已修复“提取变量”代码动作在case子句与use表达式内生成无效代码已修复记录更新中使用管道运算符时 JavaScript 目标生成无效代码已修复导入的外部函数模块名含非字母数字字符时 Erlang 目标生成无效语法已修复stdin 非终端时只输出用户友好的 LSP 消息避免冗余日志见 language-server/src/lib.rsWindows 上多个嵌套use表达式类型检查时栈溢出已修复备选模式中定义重复变量时编译器崩溃已修复多分支 case 中未正确报告不可达模式已修复。六、升级与验证建议如果你正在使用 Gleam 1.10 或更早版本升级到 v1.11.0 后建议留意新增警告布尔assert的引入与“无副作用返回值未使用”“位数组截断”“位数组模式不可达”等新警告可能让既有代码出现新的编译输出逐一处理即可体验dev目录把临时调试入口放入dev/用gleam dev运行保持src/干净享受更流畅的语言服务器体验若使用 VS Code 等支持 LSP 的编辑器升级后即可获得标签补全、变体生成、未使用导入清理等新代码动作查阅测试用例compiler-core/src/type_/tests/、compiler-cli/src/、language-server/src/tests/与test/running_modules/dev/是理解上述行为细节的最佳入口。完整的发布说明以 changelog/v1.11.md 为准后续版本的变更可对照 CHANGELOG.md 与 changelog/ 目录继续追踪。【免费下载链接】gleam⭐️ A friendly language for building type-safe, scalable systems!项目地址: https://gitcode.com/GitHub_Trending/gl/gleam创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考