Gleam 语言服务器的盛事 - Gleam v1.18.0 发布
Gleam 是一种类型安全和可扩展的语言,适用于 Erlang 虚拟机和 JavaScript 运行时。今天,Gleam v1.18.0 已经发布。语言服务器中的记录字段支持,Gleam 对静态分析和静态类型的重视,确实有助于工具的创建,这在 Gleam 深受喜爱的语言服务器中表现得尤为明显。其所有特性和功能可以在文档中查看。其余缺少的部分是对记录字段的全面支持,这个问题现在已经解决!语言服务器现在支持记录字段的转到定义、查找引用和重命名。这些功能适用于字段声明、标记参数、标记模式、记录更新和记录字段访问,无论是在模块内还是跨模块。例如: pub type Person { Person (name: String , age: Int ) } pub fn main () { let lucy = Person (name: "Lucy" , age: 10 ) lucy.name // ^ 转到定义跳转到 `name` 字段,在此重命名 // 将其在所有使用的位置重命名。 } 感谢 Alistair Smith!人们会对此感到非常高兴!类型变量重命名 同样,语言服务器现在允许在函数、类型和常量中重命名类型变量。例如: pub fn twice (value: a, f: fn (a) -> a) -> a { // ^ 重命名为 "anything" f ( f (value)) } 生成: pub fn twice (value: anything, f: fn (anything) -> anything) -> anything { f ( f (value)) } 感谢 Surya Rose!更新重命名模块的导入语言服务器的另一个新增功能是支持重命名模块。当你的文本编辑器告诉语言服务器某个 Gleam 文件已被重命名时,它会找到该模块的所有用法并更新为新名称。例如: import db_users pub fn main () -> db_users. User { db_users . new ( "username" ) } 将 db_users.gleam 重命名为 database/user.gleam 会生成: import database/user pub fn main () -> user. User { user . new ( "username" ) } 感谢 Surya Rose!值匹配的模式匹配代码操作 Gleam 的流控制是通过模式匹配完成的。考虑到这是多么普遍,语言服务器的 "值的模式匹配" 代码操作是一个很好的节省时间的工具,快速插入程序员可以添加逻辑的 case 表达式。现在,代码操作可以在函数调用及其返回值上触发。例如: pub fn main () { load_user () // ^^ 在这里触发代码操作 } fn load_user () -> Result ( User , Nil ) { todo } 将生成以下代码: pub fn main () { case load_user () { Ok (value) -> todo Error (value) -> todo } } 感谢 Giacomo Cavalieri!更快的 JavaScript 与数据单例 当目标是 JavaScript 时,Gleam 的编译器输出的 JavaScript 代码简单明了,类似于人类编写的代码。这使得其性能与手写的 JavaScript 相似,Web 框架 Lustre 利用这一点实现了与 JavaScript 框架(例如 React)相当或更好的性能。话虽如此,总是有机会改进编译器生成的代码。Gleam 现在将识别所有实例相同的数据结构,并使用一个单值替代每次构造新实例。例如,考虑以下 Gleam 代码: import gleam/option .{ type Option } pub fn two_optionals () -> #( Option (a), Option (b)) { #(option. None , option. None ) } 你可能想象到,之前,该 Gleam 代码会被编译为类似以下的 JavaScript 代码(伪代码): import { None } "../gleam_stdlib/gleam/option.mjs" ; export function two_optionals ( ) { return [ None . new ( ) , None . new ( ) ] ; } 而现在则会生成更接近于以下的代码(伪代码): import { None } "../gleam_stdlib/gleam/option.mjs" ; export function two_optionals ( ) { return [ None . instance , None . instance ] ; } 在我们的测试中,这对性能产生了显著的改善,尤其是用于大量这些数据结构的代码,比如 Lustre 应用程序的视图函数。感谢 Surya Rose 进行这一优化!模糊的管道语法弃用 Gleam 深受喜爱的管道语法为程序员提供了另一个编写嵌套函数调用的方式,使其从上到下、从左到右阅读。管道 one |> two 等同于 two(one)。大多数时候,one |> two(three) 等同于 two(one, three),然而如果这不产生正确的类型,它可以编译为 two(three)(one)。这个第二种选择意味着管道语法在视觉上是不明确的,人们无法不了解被调用的函数就得知它究竟是如何编译的。这个情况与更广泛的语言不符,因此 two(three)(one) 版本已被弃用,必须显式写成 one |> two(three)()。通过这种方式,管道遵循与用表达式相同的规则,读者始终可以清楚地知道它们如何编译。我们扫描了所有公开发布的 Gleam 代码,发现弃用的风格几乎未被使用,但只是为了帮助任何需要的人…
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡