Erlang/OTP 28 已发布,主要新特性如下:
- Priority Messages:引入优先级消息机制,允许接收进程让某些消息获得优先级状态,默认消息插入进程消息队列末尾,紧急消息可提前插入,接收进程可通过
alias/1
创建进程别名并发送优先级消息,也可停止接收优先级消息,该特性不影响信号发送顺序,性能无损失,更多详情见文档和EEP-76。 Improvements of Comprehensions:
- Strict Generators:如EEP 70所述,严格生成器旨在提高列表推导式的表达性和安全性,在 OTP 27 及更早版本中,模式匹配失败时右侧表达式的项会被忽略,而使用严格生成器在模式匹配失败时会导致推导式崩溃,严格生成器可用于列表、二进制和映射生成,与之前的生成器相比,可传达不同的程序员意图,推荐在可使用的情况下使用严格生成器,以符合 Erlang 的“让它崩溃”哲学,更多示例见List Comprehensions。
- Zip Generators:如EEP 73所述,拉链生成器可更轻松地并行迭代多个列表、二进制或映射,默认情况下 Erlang 的列表推导式以嵌套或笛卡尔方式提取元素,使用
&&
可改变默认行为,拉链生成器可与列表、二进制和映射一起使用,并可与所有现有生成器和过滤器自由混合,编译器避免创建中间元组,保留与lists:zip/2
和lists:zip/3
相同的错误行为。
- Smarter Error Suggestions:Erlang/OTP 28 编译器在发现拼写错误方面有所提升,可为常见错误类型(如
undefined_nif
、unbound_var
、undefined_function
、undefined_record
等)提供修复建议,对于错误的参数数量也会建议可用的参数数量,使编译错误更易理解,错误修复更快。 Improvements to the Shell:
- Lazy Reads from
stdin
:[PR-8962]改变了 Erlang 的stdin
读取方式,现在从stdin
读取需请求时进行,如调用io:get_line/2
时,解决了特殊字符问题,无需使用-noinput
标志,解决了[Issue-8113]等问题。 - Raw and Cooked Modes for
noshell
:noshell
模式现在支持cooked
(默认行为)和raw
(新选项,可绕过原生终端的行编辑支持)两种“子模式”,在raw
模式下可构建更交互式的应用,如读取按键并立即输出,无需用户按下 Enter,custom shell文档展示了如何创建自定义 shell,terminal interface文档展示了如何实现井字棋游戏。 - Using
fun Name/Arity
to create funs in shell:[PR-8987]使得在 shell 中可使用fun Name/Arity
创建函数,函数可从自动导入的 BIF(如is_atom/1
)创建,也可从 shell 中定义的本地函数创建。
- Lazy Reads from
- New
erlang:hibernate/0
:引入新的erlang:hibernate/0
函数,将调用进程置于等待状态,减少内存占用,接收下一个消息时唤醒,不丢弃调用栈,对于预期长时间空闲但希望简化休眠的进程很有用,通过内存使用实验表明,当有 100 万大多空闲的进程时,使用erlang:hibernate/0
可减少 75%以上的内存使用。 - Warnings for Use of Old-Style Catch:引入对使用旧样式
catch Expr
的警告,更简单的catch Expr
可能会隐藏错误,应使用try...catch...end
,在未来版本中,旧的catch
构造使用将默认生成警告,可在项目或模块级别启用warn_deprecated_catch
来防止新的使用,同时展示了如何将旧样式的catch Expr
替换为try...catch...end
。 - Based Floating Point Literals:扩展浮点数语法,支持使用任何进制的浮点数字面量,类似 Ada 和 C99/C++17,基于EEP-75,在代码生成工具中很有用,可保留位级精度。
- PCRE2:将
re
模块升级为使用 PCRE2,大部分与 PCRE 正则表达式语法向后兼容,但也有一些不同行为,如更严格的语法验证(\i
、\B
、\8
等会导致错误)、Unicode 属性更新、re:split/3
与分支重置组的不同结果等,内部格式已更改,不能在节点或 OTP 版本之间重用,升级可提高长期可维护性,但需测试现有正则表达式代码。 - Optimizations to TLS 1.3:对 SSL 与 TLS 1.3 的性能进行了优化,减少了应用数据传输的一般开销,通过小消息回显基准测试表明,使用 TLS 1.3 时 Erlang/OTP 28 可提速 15%-25%,无需更改代码。
- Nominal Types:如EEP 69所述,名义类型检查为 Dialyzer 添加了另一种类型系统,可使用
-nominal
声明名义类型,防止意外误用结构相同的类型,Dialyzer 会对函数的输入和输出类型进行名义类型检查,也有一些例外情况,更多细节见参考手册中的 Nominals。 - New Emacs Erlang Mode:OTP 团队正在开发新的 Emacs Erlang 模式,使用 treesitter 处理字符串和文档更好,可从Github或Melpa获取并尝试,欢迎贡献。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。