查看源代码 STDLIB 发行说明
本文档描述了 STDLIB 应用程序所做的更改。
STDLIB 6.2
已修复的 Bug 和故障
现在可以通过再次按下 ^[h 来展开按下 ^[h 时显示的帮助文本。
内部 ID:OTP-19260 辅助 ID:PR-8884
使用语法
fun Name/Arity
在 shell 中定义函数会失败。此问题已得到纠正,现在以下内容可以正常工作1> F = fun is_atom/1. #Fun.erl.42.18682967> > F(a). true 3> Id = fun id/1. #Fun.erl.42.18682967> 4> Id(42). ** exception error: undefined shell command id/1 5> id(I) -> I. ok 6> Id(42). 42
调试器也已得到纠正,可以正确处理 BIF 的此语法。
修复了完成 'fun(' 会导致 shell 崩溃的错误。
内部 ID:OTP-19351 辅助 ID:PR-9043
修复了 shell 在尝试完成以 '/' 开头的表达式或后跟 '(' 或 '/' 的变量时崩溃的错误。例如:Foo/ 和 Foo(。
内部 ID:OTP-19361 辅助 ID:PR-9078
zip:extract/2
使用keep_old_files
现在会遵守cwd
选项。修复了 uri_string:percent_decode 规范中的错误
内部 ID:OTP-19380 辅助 ID:GH-8755
改进和新功能
更新了 shell 文档以显示类型规范,即
h(erlang, min, 2)
) 现在在 shell 中打印类型规范和文档。> h(erlang,min,2). -spec min(Term1, Term2) -> Minimum when Term1 :: term(), Term2 :: term(), Minimum :: term(). Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.
file:io_device/0
类型已更新,以清楚地显示raw
和cooked
IoDevice 之间的区别。内部 ID:OTP-19301 辅助 ID:PR-8956
添加了
json:format_key_value_list/3
和json:format_key_value_list_checked/3
。内部 ID:OTP-19320 辅助 ID:PR-8889
改进了 计时器的文档。
内部 ID:OTP-19360 辅助 ID:ERIERL-1149,PR-9062
为
io:user/0
、io:standard_io/0
和io:standard_error/0
添加了日志记录支持。有关更多详细信息,请参阅io:setopts/2
。内部 ID:OTP-19372 辅助 ID:PR-8947
STDLIB 6.1.2
已修复的 Bug 和故障
通过此更改,当 URI 映射中未提供路径时,uri_string:normalize 假定为空路径(不会崩溃)。
内部 ID:OTP-19266 辅助 ID:ERIERL-1127,PR-8890
修复了
json:format/3
的规范。
STDLIB 6.1.1
已修复的 Bug 和故障
删除
json:decode/3
中返回的二进制文件的空白剥离。内部 ID:OTP-19227 辅助 ID:ERIERL-1130,PR-8809
修复了
zip:unzip/2
,使其在提取 Zip64 额外标头中存在垃圾的 zip 文件时不会崩溃。此错误是在 Erlang 27.1 中引入的,到目前为止仅在 MS Excel 创建的一些存档中看到。内部 ID:OTP-19241 辅助 ID:PR-8836
通过此更改,关闭过程处理了 supervisor 执行关闭与其他原因导致的子进程终止之间的竞争条件。
内部 ID:OTP-19256 辅助 ID:PR-8780
STDLIB 6.1
已修复的 Bug 和故障
现在,不正确的
io:format/0
字符串的帮助打印输出可以正确处理k
修饰符。修复了当关键字和元组出现在同一行时导致 shell 完成崩溃的错误。
内部 ID:OTP-19157 辅助 ID:PR-8638
由于 PR-7419/OTP-18671,
callback_mode
的缓存内部值开始泄漏到logger
报告中,这可能导致logger
处理程序崩溃。现在已修复此问题,可以像缓存之前一样显示设置的值。修复了与压缩 ETS 表相关的模拟器崩溃。
内部 ID:OTP-19176 辅助 ID:PR-8683
当找不到键时,
maps:update/3
的错误描述将不再坚持认为第三个参数不是映射内部 ID:OTP-19189
在为 shell 创建文档的 markdown 解析器中,已纠正了多个问题。
解析器错误地解析了括号内的格式化 markdown(粗体或斜体)。这过去在 shell 文档
(_Option._)
中显示不正确,以原文显示。此修复使Option.
以斜体显示。markdown 解析器还用于创建其他文档格式,因此这是一个影响其他生成文档格式的错误。
修复了
unicode_util
中某些代码点范围的类别。内部 ID:OTP-19210 辅助 ID:GH-8748
修复了
argparse
,使其在可用时打印子命令帮助。内部 ID:OTP-19222 辅助 ID:PR-8777
改进和新功能
已添加从围栏块到 HTML 的类注释。
内部 ID:OTP-19105 辅助 ID:PR-8499
添加了用于缩进输出的 JSON 格式化函数。
内部 ID:OTP-19112
改进了意外映射关联的非法模式错误。
内部 ID:OTP-19128 辅助 ID:PR-8555
现在,动态启动的 supervisor 的进度报告将在调试级别记录。
潜在的不兼容性
zip
模块已更新,以支持- zip64 存档 - 大于 4GB 或包含 2^32 个以上条目的存档。
- 扩展的时间戳 - 更高的分辨率和 UTC。
- UID/GID - 保存并提取原始 UID/GID。
- 修复了存档中文件的权限模式属性可以正确读取和设置的问题。
zip:list_dir/2
现在也返回目录,而不仅仅是文件。(您可以使用skip_directories
选项禁用此行为)。
原始实现中的各种错误也已得到修复,例如
- 正确编码和解码存档中条目的 DOS 时间戳(即非扩展时间戳)。
- 修复 DOS 时间戳以设置为本地时间而不是 UTC(对 UTC 时间戳使用扩展时间戳)。
- 创建存档时使用从磁盘读取的 unix 文件属性,而不是将所有内容都设置为 644。
内部 ID:OTP-19214 辅助 ID:PR-8765
STDLIB 6.0.1
已修复的 Bug 和故障
修复了缺少
-doc({file, File})
文件只会导致警告而不是错误的问题。内部 ID:OTP-19099 辅助 ID:PR-8542
修复了
json
中的错误,json:encode_key_value_list/2
不生成数组,并且json:decode/3
不会为0
调用用户回调。
STDLIB 6.0
修复的 Bug 和故障
模块
binary
中的规范已更新,以反映文档允许的内容。自有 ID:OTP-18684 辅助 ID:PR-7481
binary
模块中的几个函数在某些情况下会接受错误类型的参数。在此版本中,当给定不正确的类型时,它们现在会引发异常。如果主题二进制文件为空或给定了
{scope,{0,0}}
选项,则以下函数将接受无效的模式:binary:match/2,3
、binary:matches/2,3
、binary:replace/3,4
和binary:split/2,3
调用
binary:copy(<<1:1>>, 0)
会返回一个空二进制文件,而不是引发异常。类似地,调用binary:part/2,3
尝试在位串的 0 位置提取 0 个字节将返回一个空二进制文件,而不是引发异常。预处理器的文档现在提到,可以在
-if
或-elif
指令的条件中调用defined(Name)
,以测试Name
是否是已定义宏的名称。(此功能在 OTP 21 中实现。)如果在
-if
或-elif
中调用的函数名称不是守卫 BIF 的名称,则不会出现编译错误,而是会导致跳过指令后面的行。现在已将其更改为编译错误。潜在的不兼容性
使用 I/O 协议的
get_until
请求现在在eof
是回调返回的最后一个项目时,正确返回二进制文件或列表。simple_one_for_one
监控器的错误处理已得到增强。返回ignore
的瞬态子进程将不再导致崩溃。此外,自动关闭已被禁用,因为它对于这种监控器类型没有意义。允许这样做被认为是错误。因此,我们不认为这是一个不兼容的更改。
潜在的不兼容性
自有 ID:OTP-19029 辅助 ID:PR-8230
修复了 shell 扩展,使其在扩展具有非原子键的映射时不会崩溃,并且在给定参数时不会列出零元函数。
改进和新功能
函数
is_equal/2
、map/2
和filtermap/2
已添加到模块sets
、ordsets
和gb_sets
。编译器现在为函数头不匹配发出更友好的错误消息。例如,给定
a() -> ok; a(_) -> error.
Erlang/OTP 26 及更早版本会发出类似于以下的诊断信息
t.erl:6:1: head mismatch % 6| a(_) -> error. % | ^
而在 Erlang/OTP 27 中,诊断信息类似于
t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted? % 6| a(_) -> error. % | ^
自有 ID:OTP-18648 辅助 ID:PR-7383
zip:create/2,3
现在可以容忍提供的file_info
记录中的 POSIX 时间戳。自有 ID:OTP-18668
回调函数
gen_statem:handle_event/4
已缓存在gen_statem
引擎中,以优化回调调用速度。自有 ID:OTP-18671 辅助 ID:PR-7419
类型
beam_lib:beam/0
现在已导出。自有 ID:OTP-18716 辅助 ID:PR-7534
改进了
binary
模块的文档。自有 ID:OTP-18741 辅助 ID:PR-7585
binary:replace/3,4
现在支持使用 fun 来提供替换二进制文件。自有 ID:OTP-18742 辅助 ID:PR-7590
已按照 EEP 64 实现了三引号字符串。请参阅参考手册中的 String。
示例
1> """ a b c """. "a\nb\nc"
不带中间空格的相邻字符串字面量现在是语法错误,以避免可能与三引号字符串混淆。例如
1> "abc""xyz". "xyz". * 1:6: adjacent string literals without intervening white space
潜在的不兼容性
新函数
proc_lib:set_label/1
可用于向任何没有注册名称的进程添加描述性术语。该名称将由诸如c:i/0
、observer
之类的工具显示,并且将包含在使用gen_server
、gen_statem
、gen_event
和gen_fsm
的进程生成的崩溃报告中。可以通过调用
proc_lib:get_label/1
来检索进程的标签。请注意,这些函数适用于任何进程,而不仅仅是使用
proc_lib
的进程。示例
1> self(). <0.90.0> 2> proc_lib:set_label(my_label). ok 3> i(). . . . <0.90.0> erlang:apply/2 2586 75011 0 my_label c:pinfo/2 51 4> proc_lib:get_label(self()). my_label
-callback
属性已添加到模块sys
和erl_error
。自有 ID:OTP-18793 辅助 ID:PR-7703
已将多个接受 fun 的新函数添加到模块
timer
。函数
apply_after/2
、apply_interval/2
和apply_repeatedly/2
接受一个空 fun 作为第二个参数,而函数apply_after/3
、apply_interval/3
和apply_repeatedly/3
接受一个 n 元 fun 作为第二个参数,并接受一个 n 个参数的列表作为 fun 的第三个参数。自有 ID:OTP-18808 辅助 ID:PR-7649
已按照 EEP 66 实现了字符串字面量上的 Sigil,即:逐字和转义字符变体中的二进制和字符串 Sigil,以及默认(vanilla)Sigil。所有这些都适用于普通字符串和三引号字符串(EEP 64)。请参阅参考手册中的 Sigils。
示例
1> ~"Björn". <<"Björn"/utf8>> 2> ~b"Björn". <<"Björn"/utf8>> 3> ~S"\s*(\w+)". "\\s*(\\w+)" 4> ~B"\s*(\w+)". <<"\\s*(\\w+)">>
自有 ID:OTP-18825 辅助 ID:OTP-18750、PR-7684
已导出函数
shell:default_multiline_prompt/1
、shell:inverted_space_prompt/1
和shell:prompt_width/1
以帮助实现自定义提示符。shell 现在会对来自文档帮助命令 (
h(Module)
)、自动完成和搜索命令的长输出进行分页。自有 ID:OTP-18846 辅助 ID:PR-7845
M-h
热键 (Alt/Option-h) 现在会为光标正前方的模块或函数输出帮助。自有 ID:OTP-18847 辅助 ID:PR-7846
增加了对添加自定义代码格式化程序的支持,该格式化程序可以在提交时以您首选的格式格式化您的多行 shell 命令。请参阅
shell:format_shell_func/
和shell:erl_pp_format_func/1
。自有 ID:OTP-18848 辅助 ID:PR-7847
添加了 shell 函数,用于查看、忘记和保存本地定义的函数、类型和记录。
自有 ID:OTP-18852 辅助 ID:PR-7844
添加了
string:jaro_similarity/2
,可用于计算两个字符串之间的相似度。自有 ID:OTP-18865 辅助 ID:PR-7879
新函数
ets:update_element/4
类似于ets:update_element/3
,但采用默认元组作为第四个参数,如果不存在具有该键的先前记录,则会插入该元组。自有 ID:OTP-18870 辅助 ID:PR-7857
添加了从
gb_trees
和gb_sets
检索下一个更高或更低键/元素的函数,以及返回从给定键/元素开始的迭代器。自有 ID:OTP-18874 辅助 ID:PR-7745
当使用 shell 内建函数
c/1,2
重新编译模块时,原始编译的当前工作目录现在会被添加到 include 路径中。自身 ID: OTP-18908 辅助 ID: PR-7957
timer
模块现在使用私有表来存储其内部状态,略微提升了性能。自身 ID: OTP-18914 辅助 ID: PR-7973
EEP-59 - 文档属性 已被实现。
文档属性可用于记录函数、类型、回调和模块。关键字
-moduledoc "这里是文档"。
用于记录模块,而-doc "这里是文档"。
可分别用于函数、类型和回调的上方,以记录它们。类型、回调和函数文档可以通过
-doc false
或-doc hidden
设置为hidden
。当文档属性将类型标记为隐藏时,它们将不会成为文档的一部分。默认情况下,来自
moduledoc
和doc
的文档会按照 EEP-48 的格式添加到二进制 beam 文件中。使用编译器标志
warn_missing_doc
将在导出的函数、类型和回调中缺少-doc
属性时引发警告。使用编译器标志
warn_missing_spec_documented
将在已记录的函数、类型和回调中缺少 spec 属性时引发警告。moduledoc
和doc
可以引用要嵌入的外部文件,例如-doc {file, "README.md"}.
,它引用当前工作目录下的README.md
文件。当导出的函数的 spec 引用隐藏类型时,编译器会发出警告。因此,当导出的函数中使用隐藏类型(意味着该类型不是文档的一部分)时,将会出现警告。
自身 ID: OTP-18916 辅助 ID: PR-7936
新增
ets
函数ets:first_lookup/1
、ets:next_lookup/2
、ets:prev_lookup/2
和ets:last_lookup/1
。例如:ets:next_lookup/1
等效于ets:next/2
后面紧跟着ets:lookup/2
以及下一个键。新的组合函数效率更高,并保证原子性。自身 ID: OTP-18923 辅助 ID: PR-6791
maybe
表达式现在默认启用。要将
maybe
用作原子,需要使用单引号将其括起来。或者,可以通过禁用maybe_expr
功能来禁用maybe
表达式。可以通过在 Erlang 源文件的开头添加以下行来实现:-feature(maybe_expr, disable).
禁用
maybe_expr
功能的另一种方法是将-disable-feature
选项传递给erlc
erlc -disable-feature maybe_expr some_file.erl
自身 ID: OTP-18944 辅助 ID: PR-8067
编译器现在会在更新记录/映射字面量时发出警告。例如,考虑以下模块
-module(t). -export([f/0]). -record(r, {a,b,c}). f() -> #r{a=1}#r{b=2}.
编译器会发出以下警告
1> c(t). t.erl:6:12: Warning: expression updates a literal % 6| #r{a=1}#r{b=2}. % | ^
自身 ID: OTP-18951 辅助 ID: PR-8069
文档已迁移为使用 Markdown 和 ExDoc。
自身 ID: OTP-18955 辅助 ID: PR-8026
优化了
ets:foldl
和ets:foldr
以使用新的ets:next_lookup
。还使其免受表重命名的影响。自身 ID: OTP-18993 辅助 ID: PR-8048
Windows 现在支持
math
中的所有函数。自身 ID: OTP-19001 辅助 ID: PR-8164
erl_lint
(以及扩展的compiler
) 现在会警告使用已弃用的回调的代码。当前唯一已弃用的回调是
gen_server
、gen_event
和gen_statem
中的format_status/2
。可以使用
nowarn_deprecated_callback
来消除警告。自身 ID: OTP-19010 辅助 ID: PR-8205
编码和解码都可以自定义。解码可以以类似 SAX 的方式完成,并处理多个文档和数据流。
自身 ID: OTP-19020 辅助 ID: PR-8111
STDLIB 5.2.3.3
修复的错误和故障
修复了 uri_string:percent_decode 规范中的错误
自身 ID: OTP-19380 辅助 ID: GH-8755
STDLIB 5.2.3.2
修复的错误和故障
通过此更改,关闭过程处理了 supervisor 执行关闭与其他原因导致的子进程终止之间的竞争条件。
自身 ID: OTP-19256 辅助 ID: PR-8780
通过此更改,当 URI 映射中未提供路径时,uri_string:normalize 假定为空路径(不会崩溃)。
自身 ID: OTP-19266 辅助 ID: ERIERL-1127, PR-8890
STDLIB 5.2.3.1
修复的错误和故障
修复了当关键字和元组出现在同一行时导致 shell 完成崩溃的错误。
自身 ID: OTP-19157 辅助 ID: PR-8638
STDLIB 5.2.3
修复的错误和故障
修复了 erlang shell 中
-type a() :: $a.
的 shell 扩展。自身 ID: OTP-19062
修复了 shell 作业控制模式在输入
TAB
或CTRL+R
时崩溃的问题。自身 ID: OTP-19072 辅助 ID: PR-8391
STDLIB 5.2.2
修复的错误和故障
在宏参数中使用
maybe
构造可能会导致编译器崩溃。自身 ID: OTP-19031 辅助 ID: GH-8268
STDLIB 5.2.1
修复的错误和故障
argparse
显示的帮助文本现在将按正确的顺序显示子命令参数。自身 ID: OTP-18900 辅助 ID: PR-7945, GH-7934
澄清了关于用户定义的帮助模板的 argparse 文档。
自身 ID: OTP-18937
修复了在使用无效原子进行扩展时,shell 扩展会崩溃的问题。
自身 ID: OTP-18953 辅助 ID: GH-8016 PR-8075
STDLIB 5.2
修复的错误和故障
使
shell_docs
正确修剪代码块末尾的换行符。自身 ID: OTP-18777 辅助 ID: PR-7663
将某些文件中无意的 Erlang Public License 1.1 标头替换为预期的 Apache License 2.0 标头。
自身 ID: OTP-18815 辅助 ID: PR-7780
修复了自动完成在尝试展开嵌套元组时可能导致 shell 崩溃的错误。
自身 ID: OTP-18822 辅助 ID: PR-7796
移除了自动完成中函数参数、元组、记录和映射的自动关闭功能,因为这可能会干扰原子的自动完成。
自身 ID: OTP-18823
修复了自动完成字符串格式化会删除具有相同名称但大小写不同的建议的问题。
自身 ID: OTP-18824
修复了 shell 中 ctrl+h、ctrl+backspace 只删除一个字符而不是整个单词的问题。
自身 ID: OTP-18826 辅助 ID: PR-7797
修复了可以覆盖 shell 的默认键盘快捷键的问题。
自身 ID: OTP-18827 辅助 ID: PR-7797
允许在受限 shell 中使用 shell 本地函数 v()
自身 ID: OTP-18828 辅助 ID: PR-7799
当编写无效属性(如 '1> -hej.')时报告语法错误。
自身 ID: OTP-18829 辅助 ID: PR-7799
当尝试在映射生成器的键中匹配记录的一部分时,将匹配整个记录。
自身 ID: OTP-18866 辅助 ID: GH-7875, PR-7878
改进和新特性
针对意外使用未来三重引号字符串分隔符的警告已升级为改为警告相邻的没有插入空格的字符串,这实际上与字符串开头相同,但也涵盖了字符串结尾的相同情况。
自身 ID: OTP-18821 辅助 ID: OTP-18746
原计划在 OTP 27 中删除的已弃用
slave
模块已推迟到 OTP 29。自身 ID: OTP-18840 辅助 ID: PR-7629
已向
gen_*:start*
API 函数添加了 guard,以便更早地捕获错误的参数。在此更改之前,在某些情况下,错误的参数可能会一直存在,并在启动后不久导致服务器稍后失败。自身 ID: OTP-18857 辅助 ID: GH-7685
STDLIB 5.1.1
改进和新特性
当减少保存的历史记录和结果数量时,对 shell 进程进行垃圾回收。
自身 ID: OTP-18773 辅助 ID: PR-7691
STDLIB 5.1
修复的错误和故障
当编译调用具有巨大正元组大小的
is_record/3
时,编译器可能会无限期运行。在函数体中使用is_record(A, a, 0)
调用会导致编译器崩溃。在 guard 中使用时,编译器会发出不正确的代码,该代码会接受{a>
作为记录。自身 ID: OTP-18605 辅助 ID: GH-7298, GH-7317
修复了
ets:tab2file
中的一个错误,如果另一个 Erlang 进程同时创建了同一个文件,该错误可能会导致其失败。自身 ID: OTP-18614 辅助 ID: GH-7162, PR-7237
现在,
{else_clause,Value}
异常将在 shell 中得到很好的报告。自身 ID: OTP-18616 辅助 ID: GH-7258
更正了错误情况的返回值,使其与文档记录的和预期的返回值 {error, {already_started, pid()}} 在使用本地注册名称时匹配。
自身 ID: OTP-18627 辅助 ID: PR-7072
sys:get_state/1,2
和sys:replace_state/2,3
已被更正,以处理名为error
的状态作为状态名称,而不是作为失败的系统回调。对于标准服务器行为,这仅在状态名称为
error
时,以及对于gen_server
,如果完整状态为{error,_}
时,对于gen_statem
(和gen_fsm
)来说是一个问题。自身 ID: OTP-18633
filelib:safe_relative_path/2
中修复了多个问题。如果其第二个参数是包含符号链接的路径,则可能会返回不正确的结果补丁。此外,有时路径会被错误地认为是不安全的。自身 ID: OTP-18655 辅助 ID: GH-6460, PR-7208
修复了当
erl.exe
在 Windows 上用作管道的一部分并尝试设置standard_io
设备的编码时出现的死锁。自身 ID: OTP-18675 辅助 ID: PR-7473 GH-7459
扩展了有关如何使用
standard_io
、standard_error
和user
I/O 设备的文档。添加了类型
io:standard_io/0
、io:standard:error/0
和io:user/0
。自身 ID: OTP-18676 辅助 ID: PR-7473 GH-7459
修复了
h/2,3
以正确渲染多子句文档。自身 ID: OTP-18683 辅助 ID: PR-7502
由
timer:apply_after/4
、apply_interval/4
和apply_repeatedly/4
创建的计时器,如果在计时器过期时无法派生进程,则会静默地执行 apply 操作失败。现在已对此进行了更正,如果派生失败,系统将会关闭并生成崩溃转储。自身 ID: OTP-18759 辅助 ID: GH-7606
当 Erlang 源文件缺少模块定义时,该文件中每个 spec 都会出现虚假的“模块名称不能为空”诊断信息。
自身 ID: OTP-18763 辅助 ID: GH-7655
改进和新功能
在
argparse
中,选项类型的参数描述已变得不那么模棱两可。自身 ID: OTP-18679 辅助 ID: ERIERL-965
澄清了
gen_server:call/2,3
上正常关闭原因的文档。自身 ID: OTP-18690 辅助 ID: PR-7511, GH-7510
现在,对
0.0
进行模式匹配和等价性(=:=
、=/=
)比较将会引发警告,因为它在 OTP 27 中将不再被认为等同于-0.0
。如果确实需要专门匹配
0.0
(与-0.0
不同),则可以通过编写+0.0
来抑制警告。算术比较运算符不受影响,包括算术相等运算符(
==
)。* 潜在的不兼容性 *
自身 ID: OTP-18696
在文档中,澄清了 OTP-26.0 中引入的
gen_{server,statem,event}
行为的同步启动行为的语义,即 OTP-18471。自身 ID: OTP-18705 辅助 ID: GH-7524, OTP-18471, GH-6339, PR-6843
添加了设置自定义多行提示的功能。
自身 ID: OTP-18736 辅助 ID: PR-7564
已根据 EEP 64 实现三重引号字符串的警告(意外使用)。
* 潜在的不兼容性 *
自身 ID: OTP-18746 辅助 ID: PR-7313, PR-7456
现在可以配置 shell 的键盘快捷键。
自身 ID: OTP-18754 辅助 ID: PR-7604 PR-7647
STDLIB 5.0.2
修复的错误和故障
修复了在终端中输入 Alt+Enter 时,光标会移动到最后一行,而不是移动到下一行的错误。
自身 ID: OTP-18580 辅助 ID: PR-7242
修复了当使用
-noshell
启动 erlang 时,从 stdin 读取时的 eof 处理。自身 ID: OTP-18640 辅助 ID: PR-7384 GH-7368 GH-7286 GH-6881
修复了如果输出在 shell 中写入提示后收到,则输出会消失的问题。
自身 ID: OTP-18652 辅助 ID: PR-7242
当给定长列表或二进制文件时,以下函数现在快得多
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自身 ID: OTP-18659 辅助 ID: PR-7426
STDLIB 5.0.1
修复的错误和故障
POSIX 错误
exdev
有时在某些错误消息中被错误地描述为“跨域链接”。自身 ID: OTP-18578 辅助 ID: GH-7213
STDLIB 5.0
修复的错误和故障
dets
中的所有进程调用都已更新为使用接收队列优化。自身 ID: OTP-18275 辅助 ID: PR-6045
当启动的进程失败时,
proc_lib:start*/*
已变为同步的。这要求失败的进程使用新函数proc_lib:init_fail/2,3
或退出以指示失败。所有 OTP 行为都已修复以执行此操作。所有这些启动函数现在都会使用来自进程链接的
'EXIT'
消息作为所有错误返回。以前,只有start_link/*
函数执行此操作,并且仅在启动的函数退出时,而不是当它使用init_ack/1,2
或init_fail/2,3
创建返回值时。* 潜在的不兼容性 *
自身 ID: OTP-18471 辅助 ID: GH-6339, PR-6843
修复了
file:read(standard_io, ...)
在二进制模式下意外返回eof
的错误。自身 ID: OTP-18486 辅助 ID: PR-6881
在 shell 中,如果命令的返回值是
undefined
,则v(N)
将无法检索该命令。自身 ID: OTP-18548 辅助 ID: PR-6967
改进和新功能
Erlang shell 已得到改进,以支持以下功能
- 自动完成变量、记录名称、记录字段名称、映射键、函数参数类型和文件名。
- 在 shell 中打开外部编辑器 (使用 C-o) 以在编辑器中编辑当前表达式。
- 支持在 shell 中定义记录(带有类型)、函数和函数类型规范以及自定义类型。
- 不要将 pager 命令和 io:getline 的输入保存在历史记录中。
自身 ID: OTP-14835 辅助 ID: PR-5924
Gen_server 现在缓存外部函数,以便在 handle_call、handle_cast 和 handle_info 中使用。
自身 ID: OTP-15597 辅助 ID: PR-5831
TTY/终端子系统已被重写,将更多代码从旧的链接驱动程序移动到 Erlang,并在 NIF 中实现所需的所有 I/O 原语。
在 Unix 平台上,用户除了更好地处理 Unicode 字符和修复一些长期存在的错误外,应该不会注意到很多差异。
Windows 用户会注意到 erl.exe 具有与普通 Unix shell 相同的功能,并且 werl.exe 已被删除并替换为指向 erl.exe 的符号链接。这使得 Windows Erlang 终端体验与 Unix 相同。
重写带来了一些错误修复和功能添加
- Erlang 退出时,TTY 现在会重置,从而修复了 zsh 在终止 Erlang 会话时不会中断的问题。
standard_error
现在使用与standard_io
相同的 unicode 模式。- 在使用空搜索字符串搜索 shell 历史记录时按退格键不再会破坏 shell。
- 现在,制表符扩展在通过 JCL 接口启动的远程节点上工作。
- 现在可以配置 shell 标语和会话标语(即在启动 Erlang shell 时显示的文本)。有关更多详细信息,请参阅 kernel 文档。
- 添加了 shell:start_interactive,用于从非交互式 Erlang 会话(例如 escript)启动交互式 shell。
- 在 Windows 上,当以分离模式启动时,标准处理程序现在设置为
nul
设备,而不是被取消设置。 - 如果支持,标准 I/O 现在始终默认为
unicode
模式。以前,如果运行时系统以-oldshell
或-noshell
启动(例如,在escript
中),则默认值为latin1
。要通过标准输出发送原始字节,现在必须显式指定io:setopts(standard_io, [{encoding, latin1}]).
* 潜在的不兼容性 *
自身 ID: OTP-17932 辅助 ID: PR-6144 GH-3150 GH-3390 GH-4343 GH-4225
添加了
zip:zip_get_crc32/2
函数,以从打开的 ZIP 存档中检索 CRC32 校验和。自身 ID: OTP-18159 辅助 ID: PR-6904
向
peer:start
函数添加了选项post_process_args
和detached
。自身 ID: OTP-18176 辅助 ID: PR-6118
re:replace/3,4
函数现在接受一个 fun 作为替换参数。自身 ID: OTP-18221 辅助 ID: PR-6197
base64
模块的性能已得到显著提高。例如,在具有 JIT 的 x86_64 系统上,编码和解码速度都比 Erlang/OTP 25 快三倍以上。自身 ID: OTP-18228 辅助 ID: GH-5639
改进了
timer:apply_interval/4
的实现,减少了计时器服务器的负载,并引入了新函数timer:apply_repeatedly/4
。timer:apply_repeatedly/4
类似于timer:apply_interval/4
,但timer:apply_repeatedly/4
阻止并行执行触发的apply
操作,而timer:apply_interval/4
不会。自身 ID: OTP-18236 辅助 ID: PR-6256
base64
模块现在支持使用备用 URL 安全字母进行编码和解码,并支持接受或添加缺少的=
填充字符的选项。自身 ID: OTP-18247 辅助 ID: PR-6280, PR-6711
添加了
shell:whereis/0
,该函数可用于定位当前 shell 进程。自身 ID: OTP-18272 辅助 ID: PR-6279
当输入
tab
时,Erlang shell 的自动补全行为已更改为在编辑当前行之后发生,而不是之前。此行为可以使用
shell_expand_location
STDLIB 配置参数进行配置。自有 ID:OTP-18278 辅助 ID:PR-6260
新的函数
ets:lookup_element/4
增加了一个Default
参数,如果键在表中不存在,则返回该参数。旧的ets:lookup_element/3
会引发badarg
异常,这既不方便又速度较慢。自有 ID:OTP-18279 辅助 ID:PR-6234
现在在 shell 中输入
Ctrl+L
会清空屏幕并重绘当前行,而不仅仅是重绘当前行。要仅重绘当前行,现在必须输入Alt+L
。这使得Ctrl+L
的行为更接近 bash 和其他 shell 的工作方式。* 潜在的不兼容性 *
自有 ID:OTP-18285 辅助 ID:PR-6262
使用
standard_io
连接的peer
节点现在将节点中的标准错误包含在已启动节点的 IO 流中。自有 ID:OTP-18287 辅助 ID:PR-5955
二进制语法中的一个限制已被删除。现在可以并行匹配二进制模式。示例:
<<A:8>> = <<B:4,C:4>> = Bin
自有 ID:OTP-18297 辅助 ID:GH-6348
改进了
unicode:characters_to_list()
的类型规范。自有 ID:OTP-18301 辅助 ID:PR-6350
在
lists
模块中,zip
系列函数现在接受选项以允许处理不同长度的列表。自有 ID:OTP-18318 辅助 ID:PR-6347
文档中说明
$\^X
是 Control X 的 ASCII 代码,其中 X 是大写或小写字母。然而,这种表示法适用于任何字符 X,即使它没有意义。在 Erlang/OTP 26 中,文档现在说明以下字符也允许跟在
\^
字符之后:@
、[
、\
、]
、^
、_
和?
。尝试使用其他字符将导致编译器错误。$\^?
的值现在是 127(而不是早期版本中的 31)。自有 ID:OTP-18337 辅助 ID:GH-6477, PR-6503
添加了
binary:encode_hex/2
函数,以允许编码后的十六进制数字为小写或大写。自有 ID:OTP-18354 辅助 ID:PR-6297
引入了具有用户指定时间单位的
timer:tc()
的变体。自有 ID:OTP-18355 辅助 ID:PR-6507
新的函数
math:tau/0
。返回2*math:pi()
。自有 ID:OTP-18361 辅助 ID:PR-6536
现在允许在保护和匹配规范中使用 BIF
min/2
和max/2
。自有 ID:OTP-18367 辅助 ID:GH-6544
优化了
gen_server:multi_call()
。自有 ID:OTP-18385 辅助 ID:PR-6698
现在已经实现了 EEP 58 中建议的 Map 推导。
自有 ID:OTP-18413 辅助 ID:EEP-58, PR-6727
通过更改原子键的内部排序顺序,优化了一些 Map 操作。这改变了(未记录的)小型 Map 中原子键的打印方式以及
maps:to_list/1
和maps:next/1
返回的顺序。新顺序是不可预测的,并且可能在 Erlang VM 的不同调用之间发生变化。对于顺序很重要的应用程序,有一个新的函数
maps:iterator/2
用于创建以确定性顺序返回 Map 元素的迭代器。此外,io:format()
的格式字符串还添加了新的修饰符k
和K
,以支持按顺序打印 Map 元素。自有 ID:OTP-18414 辅助 ID:PR-6151
使 gen_server 使用 init/1 的新返回值“静默”失败。
自有 ID:OTP-18423 辅助 ID:https://github.com/erlang/backlog/issues/142
改进了选择性接收优化,现在可以为从其他函数返回的引用启用该优化。
这大大提高了
gen_server:send_request/3
、gen_server:wait_response/2
和类似函数的性能。自有 ID:OTP-18431 辅助 ID:PR-6739
不再需要在运行时系统中启用功能才能加载使用该功能的模块。在编译时在编译器中启用该功能就足够了。
这意味着要在 Erlang/OTP 26 中使用
maybe_expr
功能,只需在编译期间启用它即可。在 Erlang/OTP 27 中,默认情况下将启用
maybe_expr
功能,但可以禁用它。自有 ID:OTP-18445
静态监督者在启动后是非常空闲的进程,因此它们现在将在启动后休眠以改进资源管理。
自有 ID:OTP-18474 辅助 ID:PR-6895
弃用
dbg:stop_clear/0
,因为它只是dbg:stop/0
的函数别名。自有 ID:OTP-18478 辅助 ID:GH-6903
在
ms_transform
中添加了对操作caller_line/0
、current_stacktrace/0
和current_stacktrace/1
的支持。自有 ID:OTP-18494 辅助 ID:PR-6924
模块
lists
中的枚举函数系列已扩展了enumerate/3
,该函数允许提供步长值。自有 ID:OTP-18495 辅助 ID:PR-6943
将 Unicode 更新到 15.0.0 版本。
自有 ID:OTP-18500
为
re
模块提供支持的正则表达式库很可能会在 Erlang/OTP 27 中发生更改。请参阅 即将到来的潜在不兼容性。自有 ID:OTP-18511 辅助 ID:PR-7017
提高了在减去少量元素时
sets:subtract/2
的性能。自有 ID:OTP-18515 辅助 ID:GH-6990
linter 将不再为欠规范的不透明类型引发警告。
自有 ID:OTP-18518 辅助 ID:GH-7015
添加了 EEP-61 中引入的新内置类型
dynamic/0
,从而改进了对渐进式类型检查器的支持。自有 ID:OTP-18522
先前由
gen_statem
使用的调用代理进程,用于防止超时或连接丢失时晚到的回复到达客户端,已被删除。由于 _进程别名_ 可以处理此问题,并且所有 OTP 26 Erlang 节点都可以与之通信的所有 Erlang 节点都支持此功能,因此不再需要它。自有 ID:OTP-18537 辅助 ID:PR-7081
添加了
argparse
模块,用于简化 escript 和类似情况下的参数处理。自有 ID:OTP-18558 辅助 ID:PR-6852
添加了对 shell 中多行表达式和导航的支持。添加了新的快捷键绑定:
- 向上导航 (ctrl+up)/(alt+up)
- 向下导航 (ctrl+down)/(alt+down)
- 在行中间插入换行符 (alt+enter)
- 导航到顶部 (alt+<)/(alt+shift+up)
- 导航到底部 (alt+>)/(alt+shift+down)
- 清除当前表达式 (alt+c)
- 取消搜索 (alt+c)
- 在 Mac 上打开编辑器 (option+o)/(alt+o)
修改了新行的提示,使其更清楚地表明提示已进入多行模式。支持小窗口尺寸的终端,建议不低于 7 行和 40 列。修改了搜索提示以支持多行语句。从 JCL 菜单继续后重绘提示。
自有 ID:OTP-18575 辅助 ID:PR-7169
STDLIB 4.3.1.6
已修复的错误和故障
修复了 uri_string:percent_decode 规范中的错误
自身 ID: OTP-19380 辅助 ID: GH-8755
STDLIB 4.3.1.5
已修复的错误和故障
通过此更改,关闭过程处理了 supervisor 执行关闭与其他原因导致的子进程终止之间的竞争条件。
自身 ID: OTP-19256 辅助 ID: PR-8780
通过此更改,当 URI 映射中未提供路径时,uri_string:normalize 假定为空路径(不会崩溃)。
自身 ID: OTP-19266 辅助 ID: ERIERL-1127, PR-8890
STDLIB 4.3.1.4
已修复的错误和故障
在宏参数中使用
maybe
构造可能会导致编译器崩溃。自身 ID: OTP-19031 辅助 ID: GH-8268
STDLIB 4.3.1.3
改进和新功能
当减少保存的历史记录和结果数量时,对 shell 进程进行垃圾回收。
自身 ID: OTP-18773 辅助 ID: PR-7691
STDLIB 4.3.1.2
已修复的错误和故障
当给定长列表或二进制文件时,以下函数现在快得多
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自身 ID: OTP-18659 辅助 ID: PR-7426
STDLIB 4.3.1.1
改进和新功能
静态监督者在启动后是非常空闲的进程,因此它们现在将在启动后休眠以改进资源管理。
自有 ID:OTP-18556
STDLIB 4.3.1
已修复的错误和故障
已更新
erl_parse
模块中的类型规范,以包含maybe
构造和!
运算符。自有 ID:OTP-18506 辅助 ID:GH-6956
STDLIB 4.3
已修复的错误和故障
修复了会导致分析崩溃的错误。
自有 ID: OTP-18372 辅助 ID: GH-6580
修复了格式化错误报告的堆栈跟踪时发生的崩溃问题。
自有 ID: OTP-18375 辅助 ID: GH-6591
现在,
list_to_integer/1
和list_to_integer/2
BIF 不会崩溃,而是针对无法转换为整数的过长列表引发system_limit
异常。类似地,string:to_integer/1
BIF 现在针对过长列表返回{error,system_limit}
。自有 ID: OTP-18475 辅助 ID: PR-6897
改进和新特性
移除了添加到状态的
supervisor
记录中不必要的undefined
类型。自有 ID: OTP-18393 辅助 ID: PR-6666
STDLIB 4.2
修复的错误和故障
erl_tar
现在可以读取经过填充的 gzip 压缩 tar 文件。对于file:open/2
,有一个新的选项compressed_one
,它将从 gzip 文件中读取单个成员。自有 ID: OTP-18289 辅助 ID: PR-6343
并发调用
ets:rename
可能会导致ets:delete_all_objects
在执行到一半时失败并出现 badarg 错误。自有 ID: OTP-18292 辅助 ID: PR-6366
不允许从保护表达式中调用函数。当通过使用调用函数的默认初始化表达式构造记录时,编译器未能拒绝在保护表达式中的调用。
自有 ID: OTP-18325 辅助 ID: GH-6465, GH-6466
当在列表推导中使用具有复杂字段初始化表达式的记录作为过滤器时,编译器可能会崩溃。
自有 ID: OTP-18336 辅助 ID: GH-6501, PR-6502
unicode:characters_to_binary()
可能会构建不必要的大调用堆栈。自有 ID: OTP-18351 辅助 ID: ERIERL-885, PR-6529
改进和新特性
改进了 ets:new/2 名称冲突的错误消息。使用“名称已存在”代替不太具体的“无效选项”。
自有 ID: OTP-18283 辅助 ID: PR-6338
STDLIB 4.1.1
修复的错误和故障
当控制连接的监管进程崩溃时,
peer
节点无法停止。当使用备用控制连接时,当peer
节点被启动它的节点停止时,此监管进程也经常崩溃,导致peer
节点在没有停止的情况下徘徊。自有 ID: OTP-18249 辅助 ID: PR-6301
STDLIB 4.1
修复的错误和故障
修复了
global
中由于nodeup
/nodedown
消息未在连接上的流量之前/之后传递而导致的不一致性错误。还修复了global_group
和global
中各种其他不一致性错误和死锁。作为这些修复的构建块,引入了新的 BIF
erlang:nodes/2
,并扩展了net_kernel:monitor_nodes/2
。如果命令行上存在多个实例,则
-hidden
和-connect_all
命令行参数不起作用,此问题已修复。为了替换-connect_all
命令行参数,还引入了新的内核参数connect_all
。自有 ID: OTP-17934 辅助 ID: PR-6007
修复了
public_key:ssh*
函数,使其在已删除功能用户指南中的正确版本下列出。自有 ID: OTP-18139 辅助 ID: PR-6060
gen_statem
、gen_server
和gen_event
中的format_status/1
的类型规范已更正,以说明返回值与参数的类型相同(而不是与参数的值相同)。自有 ID: OTP-18142 辅助 ID: PR-6078
如果
timer
服务器子规范已存在于kernel_sup
中但未启动,则timer
服务器将无法启动并出现{error, already_present}
错误,而不是重新启动服务器。自有 ID: OTP-18146 辅助 ID: PR-5983
当在
gen_statem
中更改回调模块时,旧模块中的 state_enter 调用标志被用于新模块中的第一个事件,这可能会混淆新模块并导致故障。此错误已得到纠正。通过此更改,一些
sys
调试消息格式已修改,这对于依赖于该格式的调试代码来说可能是一个问题。* 潜在的不兼容性 *
自有 ID: OTP-18239
改进和新特性
有一个新的配置选项
--enable-deterministic-build
,它将在构建 Erlang/OTP 时应用deterministic
编译器选项。deterministic
选项已得到改进,以消除多个应用程序中更多不确定性的来源。自有 ID: OTP-18165 辅助 ID: PR-5965
rfc339_to_system_time/1,2
函数现在允许从时区中省略分钟部分。自有 ID: OTP-18166 辅助 ID: PR-6108
已优化
gen_event
中的receive
语句,使其不使用选择性接收(这从来不需要,并且可能在高负载下导致严重的性能下降)。自有 ID: OTP-18194 辅助 ID: PR-6199
添加新的 API 函数 erl_features:configurable/0
自有 ID: OTP-18199 辅助 ID: PR-5790
STDLIB 4.0.1
修复的错误和故障
在 Erlang/OTP 25 的初始版本中,绑定到记录初始化中的
_
伪字段的表达式总是被计算一次,即使记录中的所有其他字段都已显式初始化。如果不是所有字段都已初始化,这将破坏将表达式error(...)
绑定到_
以获取异常的用例。绑定到
_
的行为已恢复为 OTP 25 之前的行为,即如果所有字段都已绑定到显式值,则不计算表达式。自有 ID: OTP-18110 辅助 ID: GH-6000
STDLIB 4.0
修复的错误和故障
改进了 Erlang 代码检查器对未使用类型的检查。
自有 ID: OTP-17370 辅助 ID: GH-4784
修复了
proc_lib:stop/3
中的竞争条件,在该条件中,当给定的超时时间非常短时,进程不会停止。自有 ID: OTP-17480 辅助 ID: GH-4853 PR-4872
现在
ms_transform
完全支持映射。自有 ID: OTP-17518 辅助 ID: GH-4915
修复了以 self() 作为第一个参数的 gen_server:call,使其抛出错误而不是超时失败。
对于 gen_statem:call/3、gen_event:sync_notify/2 和任何其他依赖于内部 gen:call/3 函数的功能,也进行了相同的修复。
当使用 io:format/2 且当前 group_leader 设置为当前进程时,也进行了类似的修复。
* 潜在的不兼容性 *
自有 ID: OTP-17544 辅助 ID: PR-5008
erl_pp 打印一元 - 和 + 运算符时,运算符和操作数之间有空格。通过在两者之间不留任何空格来修复此问题。
自有 ID: OTP-17566 辅助 ID: PR-5095, GH-5093
调整了 uri_string:normalize 对具有未定义端口的 URI 的行为(具有端口冒号但没有端口值的 URI 字符串或具有 port => undefined 的 URI 映射)。
从 http_request 模块中删除冗余规范化。
在此更改之前,规范化不会在这些情况下删除端口子组件,并且例如可以返回“https://127.0.0.1:"”URI。
* 潜在的不兼容性 *
自有 ID: OTP-17627
修复了
re:run
中的缩减计数错误,该错误导致函数在执行global
匹配时过于频繁地产生结果。自有 ID: OTP-17661 辅助 ID: PR-5165
修复了当使用
read_concurrency
选项时,从ets:info(Tid,memory)
返回的内存值。在此修复之前,调度程序特定的锁缓存行使用的内存未计入总内存。这导致对于具有多个锁的表,在具有多个调度程序的系统上返回的内存使用量非常不正确。
自有 ID: OTP-17832 辅助 ID: PR-5494
通过更正 gen_event 崩溃日志输出中的参数顺序来避免混淆。
自有 ID: OTP-17878
修复了
string:next_grapheme/1
,使其为最后一个字形簇的二进制输入在尾部返回一个空二进制。* 潜在的不兼容性 *
自有 ID: OTP-18009 辅助 ID: PR-5785
修复了
supervisor:sup_name/0
和supervisor:sup_ref/0
类型的类型规范。自有 ID: OTP-18034 辅助 ID: PR-4661, GH-4622
即使所有记录字段都已显式初始化,如果使用了默认记录字段初始化 (
_ = Expr
),则不会计算Expr
。这不是一个问题,除非Expr
将绑定一个随后使用的变量,在这种情况下,编译器会崩溃。例如,如果记录
#r{}
定义为只有一个字段a
,则以下代码将导致编译器崩溃#r{a=[],_=V=42}, V
为了解决该问题,编译器将确保始终至少计算一次
Expr
。现在,编译器会将示例重写为本质上V=42, #r{a=[]}, V
自有 ID: OTP-18083
改进和新特性
用户现在可以使用
{write_concurrency, auto}
选项配置 ETS 表。此选项强制表根据检测到的并发程度在运行时自动更改使用的锁数量。当{write_concurrency, auto}
处于活动状态时,默认启用{decentralized_counters, true}
选项。此处提供了将此选项与其他 ETS 优化选项进行比较的基准测试结果
https://erlang.org.cn/bench/ets_bench_result_lock_config.html
自有 ID: OTP-15991 辅助 ID: PR-5208
gen_server
、gen_statem
和gen_event
的format_status/2
回调已弃用,转而使用新的format_status/1
回调。新的回调增加了限制和更改更多内容的可能性,而不仅仅是状态,例如最后接收的消息、终止原因和每个行为类型特有的更多事件。有关更多详细信息,请参阅各个模块的文档。
自有 ID: OTP-17351 辅助 ID: GH-4673 PR-4952
timer
模块已现代化并变得更加高效,这使得计时器服务器不太容易过载。timer:sleep/1
函数现在接受任意大的整数。内部ID: OTP-17481 辅助ID: PR-4811
添加
lists:enumerate/[1,2]
。内部ID: OTP-17523 辅助ID: PR-4928
配置文件
.erlang
、.erlang.cookie
和.erlang.crypt
现在可以位于 XDG 配置主目录中。有关更多详细信息,请参阅每个文件的文档和
filename:basedir/2
。内部ID: OTP-17554 辅助ID: GH-5016 PR-5408 OTP-17821
在
calendar
函数system_time_to_rfc3339/2
和rfc3339_to_system_time
中支持native
时间单位。内部ID: OTP-17592 辅助ID: ERIERL-663, PR-5243
带标签的元组测试和函数调用已得到优化,现在比以前稍微便宜一些。
在确保所有 boxed 项在 arity 词之后至少分配一个字后,这些优化成为可能。这是通过让所有空元组引用相同的空元组字面量来实现的,这也减少了空元组的内存使用量。
内部ID: OTP-17608
parallel_messages_SUITE 中的信号队列基准测试和 ets_SUITE 中的 ETS 基准测试具有基准测试结果可视化 HTML 页面,带有“填充屏幕”按钮以使图形更大。此按钮之前无法按预期工作。当按下某个图形的按钮时,最后一个图形被替换为更大的版本,而不是按钮上的那个。现在已修复此问题。
内部ID: OTP-17630
新模块
peer
取代了slave
模块。slave
模块现已弃用,将在 OTP 27 中删除。peer
包含用于启动 erlang 节点的扩展且更健壮的 API。内部ID: OTP-17720 辅助ID: PR-5162
此更改在 uri_string 模块中引入了引用和取消引用函数 - 替代 http_uri 中已弃用的 encode 和 decode 函数。
内部ID: OTP-17778 辅助ID: GH-5368
为了使用户更容易管理多个未完成的异步
call
请求,在erpc
、gen_server
、gen_statem
和gen_event
中引入了利用请求标识符集合的新功能。内部ID: OTP-17784 辅助ID: PR-5792
更新到 Unicode 14.0 规范。
内部ID: OTP-17869 辅助ID: PR-5595
以下 ets 类型已重命名为更清晰的名称:
tab/0
重命名为table/0
,comp_match_spec/0
重命名为compiled_match_spec/0
。类型
table_access/0
和table_type/0
已导出。内部ID: OTP-17901 辅助ID: GH-4968 PR-5649
添加对将
.asn1
文件定位到filelib:find_file/1
和filelib:find_source/1
的默认搜索规则的支持。内部ID: OTP-17908 辅助ID: GH-5655 PR-5669
类型规范已添加到
gen_server
,并且文档已更新以利用此规范。这暴露出一些类型违规,这些违规已在
global
、logger_olp
和rpc
中得到纠正。内部ID: OTP-17915 辅助ID: PR-5751, GH-2375, GH-2690
现在可以使用两个或三个参数调用
erl_eval
的非本地函数处理程序。当使用三个参数调用时,第一个参数是抽象格式中节点的注释。评估期间的所有错误现在都将通过
erlang:raise/3
传递。如果受限 shell 处于活动状态并且不允许erlang:raise/3
通过,则评估错误将以不太清晰的方式打印。请参阅shell
中有关受限 shell 的文档。* 潜在的不兼容性 *
内部ID: OTP-17925 辅助ID: PR-5631
添加了
filelib:ensure_path/1
,它可以确保给定路径的所有目录都存在(与filelib:ensure_dir/1
不同,后者不会创建路径的最后一个段)。内部ID: OTP-17953 辅助ID: PR-5621
函数
groups_from_list/2
和groups_from_list/3
已添加到maps
模块。内部ID: OTP-17969 辅助ID: PR-5588
gen_server
已重构,以便在回调在Timeout
字段中返回错误值 (timeout() | 'hibernate' | {'continue,_}
) 时抛出更易于理解的异常,并且还验证gen_server:enter_loop/3,4,5
API 函数中的参数。内部ID: OTP-17974 辅助ID: GH-5683
用于删除重复项的函数
uniq/1
和uniq/2
已添加到lists
模块。内部ID: OTP-17977 辅助ID: GH-5606, PR-5766
添加了对 EEP-60 中描述的可配置功能的支持。可以在编译期间使用选项 (
-enable-feature Feature
、-disable-feature Feature
和+{feature, Feature, enable|disable}
) 到erlc
以及使用指令 (-feature(Feature, enable|disable).
) 在文件中启用/禁用功能。类似的选项可以用于erl
,以启用/禁用运行时允许的功能。新的maybe
表达式 (EEP-49) 作为maybe_expr
功能得到完全支持。功能支持在参考手册中进行了说明。内部ID: OTP-17988
自 OTP 25 起已弃用的函数
filename:safe_relative_path/1
已被删除。请改用filelib:safe_relative_path/2
。* 潜在的不兼容性 *
内部ID: OTP-17991
一个新的 PRNG 已添加到
rand
模块:mwc59
,它是与 Sebastiano Vigna 合作开发的。它旨在用于需要非常快的伪随机数的应用程序,并且它带有两个输出值加扰器,一个快速和一个彻底的。还导出了
exsp
生成器的两个内部函数,因此它们可以在rand
插件框架之外使用,以减少一些开销。还导出了内部
splitmix64
生成器,它可以用于为其他类型的 PRNG 播种,而不是它自己的。内部ID: OTP-18011
STDLIB 3.17.2.4
修复的错误和故障
当给定长列表或二进制文件时,以下函数现在快得多
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自身 ID: OTP-18659 辅助 ID: PR-7426
STDLIB 3.17.2.3
改进和新功能
静态监督者在启动后是非常空闲的进程,因此它们现在将在启动后休眠以改进资源管理。
自有 ID:OTP-18556
STDLIB 3.17.2.2
修复的错误和故障
不允许从保护表达式中调用函数。当通过使用调用函数的默认初始化表达式构造记录时,编译器未能拒绝在保护表达式中的调用。
自有 ID: OTP-18325 辅助 ID: GH-6465, GH-6466
STDLIB 3.17.2.1
修复的错误和故障
当在
gen_statem
中更改回调模块时,旧模块中的 state_enter 调用标志被用于新模块中的第一个事件,这可能会混淆新模块并导致故障。此错误已得到纠正。通过此更改,一些
sys
调试消息格式已修改,这对于依赖于该格式的调试代码来说可能是一个问题。* 潜在的不兼容性 *
自有 ID: OTP-18239
STDLIB 3.17.2
修复的错误和故障
shell_docs:get_doc/3
、shell_docs:get_callback_doc/3
和shell_docs:get_type_doc/3
的类型规范错误地声明返回的Metadata
为空映射。内部ID: OTP-18081
STDLIB 3.17.1
修复的错误和故障
编译时间不再记录在 BEAM 文件中。仍然有几个未记录的函数试图检索编译时间。现在已删除这些函数。
内部ID: OTP-17962
STDLIB 3.17
修复的错误和故障
修复了不支持 Unicode 的终端上 nbsp 的渲染。
内部ID: OTP-17662 辅助ID: PR-5206
改进了当
re
无法编译正则表达式时erl_error
的打印输出,以也打印有关编译失败原因的提示。内部ID: OTP-17750 辅助ID: PR-5366
修复了
supervisor_bridge:start_link()
的规范。内部ID: OTP-17766 辅助ID: PR-5362
在
supervisor
中添加了缺少的关闭子句,这可能会导致错误的错误报告。内部ID: OTP-17767 辅助ID: PR-5344
改进和新功能
向 erl_lint 添加
no_auto_import_types
,以允许模块定义与预定义类型名称相同的类型。内部ID: OTP-17744 辅助ID: PR-5292
STDLIB 3.16.1
修复的错误和故障
修复了一个错误,该错误可能导致当 supervisor 在取消链接和向该子项发送关闭信号之间死亡时,子项变为孤立项。
由于 supervisor 关闭子项和该子项同时自行退出的竞争,也可能导致 supervisor 报告不稳定。
内部ID: OTP-17649 辅助ID: GH-5193, PR-5201
STDLIB 3.16
修复的错误和故障
修复了
io:format
与~p
,以不再将浮点数解释为可打印字符。内部ID: OTP-17424 辅助ID: GH-4801 PR-4803
修复了 base64 编码/解码函数的规范,以也包括 0。
内部ID: OTP-17429 辅助ID: GH-4761
失败的调用
io:format("~p\n")
将导致行号为 0 而不是正确的行号和列号的警告。此问题已得到纠正,并且所有对io:format()
的失败调用的警告都已改写,以更清楚地说明问题所在。内部ID: OTP-17430
当给定选项
warn_missing_spec
和export_all
时,只会为使用-export
属性显式导出的函数缺少规范发出警告。内部ID: OTP-17434 辅助ID: GH-4772
使用内容为文件名称(而不是目录)的原子调用
c:ls/1
将会导致崩溃。内部ID: OTP-17463 辅助ID: GH-4916
即使尚未看到任何
-module()
声明,MODULE
和MODULE_STRING
宏在通过-ifdef
测试时,也总是会显示为已定义。现在已更改为,如果之前没有看到-module()
,则-ifdef ?MODULE.
将不会认为 ?MODULE 已定义。内部 ID: OTP-17505 辅助 ID: GH-4995
修复了在 shell_docs 中渲染缺失类型和回调的错误。
内部 ID: OTP-17573 辅助 ID: ERL-1264 GH-4270
当编译器使用
deterministic
选项时,?FILE
宏会在第一个include
指令之前扩展为源文件的完整路径,而在include
指令之后扩展为文件名的基本部分。内部 ID: OTP-17581 辅助 ID: PR-5141
修复了损坏的
win32reg:delete_key
,并修复了win32reg:value
以支持default
值。内部 ID: OTP-17622 辅助 ID: PR-5038
修复了调用
maps:get(some_key, #{})
的错误信息。内部 ID: OTP-17634 辅助 ID: GH-5196
改进和新功能
io
模块中的大多数输出函数现在在提供无效参数时会打印额外的错误信息。这些函数包括:io:format
、io:fwrite
、io:put_chars
、io:nl
和io:write
。内部 ID: OTP-17317 辅助 ID: PR-4757
EEP-54 (提供更多关于错误的信息) 现在为
format_error
回调包括了两个新的返回值,general
和reason
。从
format_error
回调返回的多行错误描述现在可以正确缩进。Erlang 参考手册中关于
erl_error
、error/3
和 错误和错误处理 的文档已扩展。内部 ID: OTP-17454 辅助 ID: PR-4764
在
lists
模块的文档中,已明确说明谓词函数必须返回布尔值。内部 ID: OTP-17503 辅助 ID: GH-4985
关于
c:c/1
、c:c/2
和c:c/3
的文档已进行澄清。内部 ID: OTP-17571 辅助 ID: GH-5103
STDLIB 3.15.2
修复的错误和故障
修复了在使用控制序列
p
或P
格式化元组,并使用chars_limit
选项限制输出时可能导致崩溃的错误。内部 ID: OTP-17525 辅助 ID: GH-5053
STDLIB 3.15.1
修复的错误和故障
修复了在使用控制序列 p 或 P 格式化术语,并使用
chars_limit
选项限制输出时可能导致循环的错误。内部 ID: OTP-17459 辅助 ID: GH-4824, GH-4842
STDLIB 3.15
修复的错误和故障
在
gen_statem
中,相对时间为0
的超时行为与预期模型不太一致。现在已对此进行更正。此更正引入了一个小的潜在不兼容性,例如,当将状态超时与插入的事件组合时,并且插入的事件在具有超时的状态中进行了状态更改。在此更正之前,即使在第二次状态更改后,也可能传递状态超时,但现在保证状态超时仅在为其启动的状态中传递,即使在这种特殊情况下也是如此。
* 潜在的不兼容性 *
内部 ID: OTP-15107 辅助 ID: ERL-1381, PR-2813
修复了
erl_eval
中关于位串推导的错误。内部 ID: OTP-16865
现在,以点开头的文件名(例如 "
.gitignore
")会被filename:extension/1
和filename:rootname/1
视为文件名,而不是扩展名。内部 ID: OTP-16905
修复了如果缺少命名块,则带有
allow_missing_chunks
选项的beam_lib:chunks/3
会崩溃的错误。内部 ID: OTP-16950 辅助 ID: ERL-1378
浮点零 (0.0) 可以是正数 (+0.0) 也可以是负数 (-0.0)。编译器、运行时系统和 STDLIB 中的多个错误已修复,以确保 0.0 上的负号不会丢失。
内部 ID: OTP-17077 辅助 ID: ERL-1431, PR-2903, PR-2905, PR-2906
消除了当使用
-MMD
选项同时生成依赖文件和 BEAM 文件时,Dialyzer 崩溃的问题。内部 ID: OTP-17118 辅助 ID: PR-2825
修复了
shell_docs
和erl_docgen
将em
标签解释为strong
的错误。内部 ID: OTP-17122
在 Solaris 上,
math:acos/1
和math:asin/1
函数不会因为超出有效域的参数而失败。内部 ID: OTP-17133
在使用
ms_transform
时,禁止显示unused_record
警告。解析转换ms_transform
将记录替换为元组,这可能会导致 Erlang 代码检查器发出有关未使用记录的警告。内部 ID: OTP-17186
记录了
re
模块中关于[:ascii:]
字符类匹配 Latin-1 字符的缺陷。内部 ID: OTP-17222 辅助 ID: GH-4544
修复了通用行为中启动函数的
spec
。内部 ID: OTP-17342 辅助 ID: GH-4725 PR-4726
监督者拒绝了关闭值为 0 的子规范。
内部 ID: OTP-17364 辅助 ID: PR-4747
改进和新功能
在
rand
模块中,现在可以使用算法别名default
来为默认算法播种。使用
rand:bytes/1
和rand:bytes_s/2
实现了生成伪随机二进制文件。内部 ID: OTP-14646 辅助 ID: PR-2920
已将新函数添加到
proplists
模块:to_map/1,2
和from_map/1
。内部 ID: OTP-14647 辅助 ID: PR-2910
已将新函数添加到
queue
模块:all/2
、any/2
、delete/2
、delete_r/2
、delete_with/2
和delete_with_r/2
。内部 ID: OTP-14650 辅助 ID: PR-2850
已将新函数添加到
queue
模块:fold/2
和filtermap/2
。内部 ID: OTP-14793 辅助 ID: PR-2791
已删除对在 OTP R15 之前创建的抽象代码的处理支持。
内部 ID: OTP-16678 辅助 ID: PR-2627
已实现 EEP 54 中提出的针对失败的 BIF 调用的扩展错误信息。
当 Erlang shell 中的 BIF 调用失败时,将打印更多关于哪个或哪些参数出错的信息。当 BIF 调用失败时,
proc_lib
、common_test
和qlc
也将使用相同的扩展错误信息。对于希望提供相同扩展错误信息的应用程序,有新函数
erl_error:format_exception/3
和erl_error:format_exception/4
。有一个新的
error/3
BIF,允许应用程序或库以相同的方式为自己的异常提供扩展的错误信息。内部 ID: OTP-16686
引入了 进程别名 功能,如 EEP 53 中所述。引入此功能是为了提供一种轻量级机制,可以防止超时或连接丢失后的延迟回复。有关更多信息,请参见 EEP 53 以及新的
alias/1
BIF 和monitor/3
BIF 的新选项的文档。已更新
gen_server
、gen_statem
和gen_event
使用的框架中的call
操作,以利用别名来防止延迟响应。gen_statem
行为在分布式情况下仍使用代理进程,因为它始终阻止延迟回复,并且别名不适用于 OTP 24 之前的节点。代理进程可以在 OTP 26 中删除。别名功能还可以引入与 gen 行为中的
erpc:receive_response()
函数类似的新函数,因此还引入了新函数gen_server:receive_response()
、gen_statem:receive_response()
、gen_event:receive_response()
。内部 ID: OTP-16718 辅助 ID: PR-2735
改进了关于
gen_server
终止时发出的退出信号的文档。内部 ID: OTP-16910 辅助 ID: PR-2771
已将新函数添加到
maps
模块:merge_with/3
、intersect/2
、intersect_with/3
、filtermap/2
、from_keys/2
和maps:foreach/2
。maps:merge_with/3
与merge/2
相同,但它接受一个额外的函数,用于组合具有相同键的项目。maps:intersect/2
计算两个映射的交集。maps:intersect_with/3
与intersect/2
相同,但它接受一个额外的函数,用于组合相交的项目。maps:filtermap/2
允许在单个过程中过滤和映射映射。maps:from_keys/2
从键列表和单个值构造一个映射,可用于优化集合操作,例如 from_list/1、filter/2、intersection/2 和 subtract/2。maps:foreach/2
允许遍历映射,但不返回任何值。自有 ID: OTP-16936 辅助 ID: ERL-1367
实验性的 HiPE 应用程序已移除,同时移除了其他应用程序中所有相关功能。
* 潜在的不兼容性 *
自有 ID: OTP-16963
已移除在 OTP 20 中弃用的
filename:src/1
函数。请改用filelib:find_source/1,3
。* 潜在的不兼容性 *
自有 ID: OTP-16971
浮点数的漂亮打印已更改,以便更容易查看数字的整数部分是否已舍入。更改后,可能已舍入的数字始终显示在最后或紧挨着指数字符(e 或 E)之前。这是通过始终使用科学计数法打印数字来实现的,如果它太大以至于整数部分可能被舍入。
自有 ID: OTP-16980 辅助 ID: ERL-1308
接受来自远程节点的最多 160 位的引用。这是未来 OTP 版本中使用最多 160 位引用的升级路径的第一步。
自有 ID: OTP-17005 辅助 ID: OTP-16718
向
erl_parse:abstract/2
添加location
选项。自有 ID: OTP-17024
maps API 中的所有长时间运行的函数现在都会让步。在之前的版本中,函数
maps:from_list/1
、maps:keys/1
和maps:values/1
不会让步。这可能会导致进程调度不公平。自有 ID: OTP-17057
sets
模块现在有一个可选的基于映射的实现,如EEP 50
中所述。要使用此实现,请将
{version,2}
选项传递给sets:new/1
或sets:from_list/2
。自有 ID: OTP-17059 辅助 ID: PR-2864
添加了
shell_docs:supported_tags/0
。此函数可用于检索shell_docs
当前支持的标签。自有 ID: OTP-17120
shell_docs
使用的application/erlang+html
文档存储格式已更新,以包含标签b
、strong
、h4
、h5
和h6
。自有 ID: OTP-17121
不要用不必要的括号漂亮打印
catch
表达式。PR-2584 中 Erlang 解析器语法的重写意味着,在许多情况下,不再需要catch
表达式周围的括号。自有 ID: OTP-17169 辅助 ID: PR-2584
改进了
gen_server
文档中Module:init/1
中{continue,Continue}
的解释。自有 ID: OTP-17171 辅助 ID: PR-3011
erl_eval
模块现在接受一个映射来跟踪绑定。使用orddict
进行绑定仍然有效。自有 ID: OTP-17175
记录了
epp:scan_erl_form/1
并添加了epp:scan_file/2
。自有 ID: OTP-17199 辅助 ID: PR-2658
io
和io_lib
模块使用的标准浮点打印算法已从 [1] 中描述的算法更改为 Ryu 算法 [2]。这大大提高了大多数浮点数打印的速度,并小幅提高了内存消耗。[1]:Robert G. Burger 和 R. Kent Dybvig。1996 年。快速准确地打印浮点数。在 ACM SIGPLAN 1996 年编程语言设计和实现会议(PLDI '96)论文集中。美国纽约州纽约市,计算机协会,108–116。DOI:https://doi.org/10.1145/231379.231397
[2]:Ulf Adams。2018 年。Ryū:快速浮点到字符串的转换。在第 39 届 ACM SIGPLAN 编程语言设计和实现会议(PLDI 2018)论文集中。美国纽约州纽约市,计算机协会,270–282。DOI:https://doi.org/10.1145/3192366.3192369
感谢 Thomas Depierre
自有 ID: OTP-17210
在二进制模块中添加十六进制编码和解码函数。
自有 ID: OTP-17236 辅助 ID: PR-3014
已移除未记录且部分损坏的
ets:filter/3
函数。自有 ID: OTP-17263
在
shell_docs
中添加对显示任何"text"
文档格式的支持。这意味着 shell 中的h(Module)
现在可以显示 Elixir 文档的"text/markdown"
。自有 ID: OTP-17267
类型为
set
、bag
、duplicate_bag
的 ETS 表中键的内部哈希已加盐,以区别于erlang:phash2
。这是为了避免如果使用phash2
将键分发到单独的表/节点上时出现糟糕的哈希。自有 ID: OTP-17276 辅助 ID: PR-2979
已更新为 Unicode 13.0 规范。
自有 ID: OTP-17327 辅助 ID: PR-4707
添加编译器选项
{nowarn_unused_record, RecordNames}
。记录编译器选项nowarn_unused_type
。自有 ID: OTP-17330
在 supervisor 中实现 EEP 56。它添加了
significant
子节点的概念以及auto_shutdown
supervisor 标志。有关更多信息,请参阅 supervisor 手册页面。
自有 ID: OTP-17334 辅助 ID: PR-4638, EEP-56
修复了在匹配以下划线为前缀的变量的代码中的警告。
自有 ID: OTP-17385 辅助 ID: OTP-17123
STDLIB 3.14.2.3
修复的错误和故障
不允许从保护表达式中调用函数。当通过使用调用函数的默认初始化表达式构造记录时,编译器未能拒绝在保护表达式中的调用。
自有 ID: OTP-18325 辅助 ID: GH-6465, GH-6466
STDLIB 3.14.2.2
修复的错误和故障
修复了在使用控制序列
p
或P
格式化元组,并使用chars_limit
选项限制输出时可能导致崩溃的错误。内部 ID: OTP-17525 辅助 ID: GH-5053
STDLIB 3.14.2.1
修复的错误和故障
修复了在使用控制序列 p 或 P 格式化术语,并使用
chars_limit
选项限制输出时可能导致循环的错误。内部 ID: OTP-17459 辅助 ID: GH-4824, GH-4842
STDLIB 3.14.2
修复的错误和故障
通过 zip 模块压缩的字典没有获得可执行权限(对于文件所有者),这使得无法访问字典内部的文件。这通过赋予 zip 存档内的字典 XRW 权限来修复。
自有 ID: OTP-17295 辅助 ID: GH-4687
STDLIB 3.14.1
修复的错误和故障
在
erl_parse:tokens()
中处理映射。自有 ID: OTP-16978
Erlang shell 函数
rr
已修复,可以从代码存档中的文件中读取记录。自有 ID: OTP-17182 辅助 ID: PR-3002
如果要求
beam_lib
返回 Elixir 生成的 BEAM 文件的抽象代码,并且计算机上未安装 Elixir,则beam_lib
将不再崩溃,而是返回一个错误元组。cover:compile_beam()
和cover:compile_beam_directory()
函数已更新为在这种情况下也返回错误元组。自有 ID: OTP-17194 辅助 ID: GH-4353
更正了关于
{char, C}
类型的示例模块erl_id_trans
。自有 ID: OTP-17273
STDLIB 3.14
修复的错误和故障
此更改修复了在使用 uri_string:recompose/1 时路径组件中深度列表的处理。
自有 ID: OTP-16941
修复
shell_docs
以在分页输出时清除 shell 装饰(粗体/下划线)。修复将
shell_docs
与 edoc 集成时的各种小渲染问题。自有 ID: OTP-17047
改进和新功能
改进了 uri_string 模块的 API 和文档。
在用户指南中添加了关于统一资源标识符及其使用新 API 处理的新章节。
添加了两个新的 API 函数:uri_string:allowed_characters/0 和 uri_string:percent_decode/1。
此更改已被标记为可能不兼容,因为 uristring:normalize/2 过去会解码与不在保留集中的字符对应的百分比编码字符三元组。在此更改之后,uri_string:normalize/2 将仅解码那些与未保留集中的字符(ALPHA / DIGIT / "-" / "." / "" / "~")对应的百分比编码三元组。
* 潜在的不兼容性 *
自有 ID: OTP-16460
shell_docs
模块已扩展,可以配置渲染文本的 unicode、ansi 和列大小。自有 ID: OTP-16990
STDLIB 3.13.2
修复的错误和故障
如果为名称项中带有 '_' 原子的顶点调用
digraph:in_edges/2
和digraph:out_edges/2
函数,则会返回错误的边。自有 ID: OTP-16655
filelib:wildcard("not-a-directory/..")
应返回空列表。在 Windows 上,它返回"not-a-directory/.."
。自有 ID: OTP-16700
修复 shell_docs:render 的类型规范,以使用 MFA 的正确类型。
自有 ID: OTP-16739
修复当 host 存在但输入路径不是绝对路径时 uri_string:recompose/1。
此更改防止当路径不以斜杠开头时,重组操作更改主机的顶级域名。
自有 ID: OTP-16751 辅助 ID: ERL-1283
当 '
if
' 预处理器指令引用未定义的符号时,epp
模块会返回格式错误的错误项。当使用错误的错误项调用epp:format_error/1
时会崩溃。自有 ID: OTP-16816 辅助 ID: ERL-1310
即使明确文档说明“
Start+Len
超出列表长度不是错误”,如果Start > length(List) + 1
,lists:sublist(List, Start, Len)
也会抛出异常而失败。自有 ID: OTP-16830 辅助 ID: ERL-1334, PR-2718
STDLIB 3.13.1
修复的错误和故障
当
simple_one_for_one supervisor
的临时子进程死亡时,supervisor 的内部状态会被破坏,导致 supervisor 保留 supervisor 启动的后续子进程的启动参数,从而导致 supervisor 的堆不必要地增长。状态损坏也可能导致其他问题。自有 ID: OTP-16804
STDLIB 3.13
修复的错误和故障
编译嵌套过多的匹配规范会导致运行时系统因调度程序堆栈耗尽而崩溃。现在,在这种情况下,受影响的函数将引发
system_limit
错误异常,而不是崩溃运行时系统。自有 ID: OTP-16431 辅助 ID: ERL-592
如果受影响的字段数为零,则不再允许使用
_
初始化记录字段。自有 ID: OTP-16516
修复
eval_bits
中的错误。自有 ID: OTP-16545
改进和新功能
改进了 STDLIB 和 Kernel 中大多数 OTP 行为的单行日志记录事件的打印输出。这包括
proc_lib
、gen_server
、gen_event
、gen_statem
、gen_fsm
、supervisor
、supervisor_bridge
和application
。改进了
proc_lib
中以及格式化异常时chars_limit
和depth
的处理。自有 ID: OTP-15299
删除 I/O 协议旧请求的使用和文档。
自有 ID: OTP-15695
提高了更改表大小的并发调用的 ETS 可扩展性,例如
ets:insert/2
和ets:delete/2
。此性能特性已在 OTP 22.0 中为
ordered_set
实现,现在适用于所有 ETS 表类型。改进的可扩展性可能会以
ets:info(T,size)
和ets:info(T,memory)
的更长延迟为代价。因此,添加了一个新的表选项decentralized_counters
。对于启用write_concurrency
的ordered_set
,它默认为true
,对于所有其他表类型,它默认为false
。自有 ID: OTP-15744 辅助 ID: OTP-15623, PR-2229
处理
zip
模块中的 Unicode 文件名。自有 ID: OTP-16005 辅助 ID: ERL-1003, ERL-1150
Unicode 支持已更新到 Unicode 12.1 标准。
自有 ID: OTP-16073 辅助 ID: PR-2339
所有模块
proc_lib
、gen_server
、gen_statem
和gen_event
都已扩展了start_monitor()
函数。有关更多信息,请参阅这些模块的start_monitor()
文档。自有 ID: OTP-16120 辅助 ID: ERIERL-402, PR-2427
更新了新的
erlang:term_to_iovec()
BIF。自有 ID: OTP-16128 辅助 ID: OTP-15618
记录了有关
erl_tar
中从文件描述符提取的怪癖。自有 ID: OTP-16171 辅助 ID: ERL-1057
将
ok
作为返回值添加到gen_server:reply/2
自有 ID: OTP-16210 辅助 ID: PR-2411
已向
c
添加了新函数,用于打印 Erlang 模块的嵌入式文档。这些函数是h/1,2,3 - 打印 Module:Function/Arity 的文档。
ht/1,2,3 - 打印 Module:Type/Arity 的类型文档。
嵌入式文档是在构建 Erlang/OTP 文档时创建的。
自有 ID: OTP-16222
将
indent
和linewidth
添加到erl_pp
模块的函数的选项中。自有 ID: OTP-16276 辅助 ID: PR-2443
由于进行了新的 spawn 改进,进行了小的更新。
自有 ID: OTP-16368 辅助 ID: OTP-15251
现在,当在加载 NIF 的模块中使用内联时,编译器会发出警告。
自有 ID: OTP-16429 辅助 ID: ERL-303
重构了对已弃用和已删除函数的内部处理。
自有 ID: OTP-16469
扩展
erl_parse:abstract/1,2
以处理外部 fun 表达式 (fun M:F/A
)。自有 ID: OTP-16480
添加了
filelib:safe_relative_path/2
来替换filename:safe_relative_path/1
,后者不能安全地处理符号链接。filename:safe_relative_path/1
已被弃用。自有 ID: OTP-16483 辅助 ID: PR-2542
已添加模块
shell_docs
。该模块包含用于呈现、验证和规范化嵌入式文档的函数。自有 ID: OTP-16500
现在,shell 中的模块和函数自动补全会查看所有可用的模块,而不仅仅是已加载的模块。如果模块已加载或在调用时将被加载,则认为该模块可用。
自动补全也已扩展为在新
c
中的h/1,2,3
函数中工作。自有 ID: OTP-16501 辅助 ID: OTP-16494, OTP-16222, OTP-16406, OTP-16499, OTP-16500, PR-2545, ERL-708
将内部
pcre
库更新到8.44
。自有 ID: OTP-16557
STDLIB 3.12.1.2
修复的错误和故障
修复了在使用控制序列
p
或P
格式化元组,并使用chars_limit
选项限制输出时可能导致崩溃的错误。内部 ID: OTP-17525 辅助 ID: GH-5053
STDLIB 3.12.1.1
修复的错误和故障
修复了在使用控制序列 p 或 P 格式化术语,并使用
chars_limit
选项限制输出时可能导致循环的错误。内部 ID: OTP-17459 辅助 ID: GH-4824, GH-4842
STDLIB 3.12.1
修复的错误和故障
[re:run(Subject, RE, [unicode])](
re:run/3
) 在Subject
包含非法 utf8 并且RE
作为二进制传递时返回nomatch
而不是因badarg
错误异常而失败。已对此进行更正,同时更正了re:run()
错误案例中的缩减计数。自有 ID: OTP-16553
STDLIB 3.12
修复的错误和故障
修复 uri_string:normalize/2 的类型规范,它也可能返回 error()。
自有 ID: OTP-16322
改进 uri_string:normalize/2 中的错误处理。此更改修复了当输入 URI 具有错误的百分比编码时发生的崩溃。
自有 ID: OTP-16351
修复 Erlang 漂亮打印机 (
erl_pp
) 中的小错误。自有 ID: OTP-16435
修复 Erlang 解析器中关于连续一元运算符的问题。
自有 ID: OTP-16439
当时间偏移量丢失时,让
calendar:rfc3339_to_system_time()
崩溃。自有 ID: OTP-16514 辅助 ID: ERL-1182
改进和新功能
实现 uri_string:resolve/{2,3},可用于根据基本 URI 解析 URI 引用。
自有 ID: OTP-16321
在
gen_statem
中,现在可以更改正在运行的服务器的回调模块。有关change_callback_module
、push_callback_module
和pop_callback_module
,请参阅gen_statem
的文档。自有 ID: OTP-16477 辅助 ID: PR-2531
STDLIB 3.11.2
修复的错误和故障
在 erl_tar 中消除了一个目录遍历漏洞。erl_tar 现在将拒绝提取指向目标提取目录外部的符号链接,并将返回
{error,{Path,unsafe_symlink}}
。(感谢 Eric Meadows-Jönsson 提供的错误报告和修复建议。)自有 ID: OTP-16441
STDLIB 3.11.1
修复的错误和故障
当给定启用了 write_concurrency 的 ordered_set 和无效位置时,
ets:update_counter/4
核心转储。此错误已修复。自有 ID: OTP-16378 辅助 ID: ERL-1125
STDLIB 3.11
修复的错误和故障
当传递非常大的无效代码点作为输入时,函数
unicode:characters_to_list()
和unicode:characters_to_binary()
引发badarg
异常,而不是返回错误元组。自有 ID: OTP-16052
修复了 linter 中的一个错误,其中列表和二进制推导式可能会抑制不安全的变量错误。
自有 ID: OTP-16053 辅助 ID: ERL-1039
修复了
erl_tar:open/2
、create/2,3
和add/4
的不正确的类型规范。自有 ID: OTP-16085 辅助 ID: PR-2379
修复了
binary:list_to_bin/1
的错误类型规范。参数类型已从iodata/0
更改为iolist/0
。自有 ID:OTP-16132 辅助 ID:ERL-1041
修复了
pool:pspawn_link
中的竞态条件,当使用它来派生一个非常短的进程时,会导致抛出noproc
错误。自有 ID:OTP-16211
修复了使用
compressed
选项且术语包含原子时,ETS 查找中的性能问题。在此修复之前,原子的解压缩算法会不必要地获取全局锁来验证原子。自有 ID:OTP-16316
改进和新特性
添加了一个新的编译器/linter 选项来禁用未使用类型的警告 (
nowarn_unused_type
)。自有 ID:OTP-16262 辅助 ID:ERIERL-435
ETS 表已得到优化,在仅启用一个调度器的系统中运行时不使用任何锁。这可以为大量使用 ETS 表的应用程序提供显著的性能提升。
自有 ID:OTP-16315
STDLIB 3.10
修复的错误和故障
re:run()
现在会在验证大型主题中的 utf8 时让步。自有 ID:OTP-15836 辅助 ID:ERL-876
将 ERTS 内部 PCRE 库从 8.42 版本升级到 8.43 版本。有关对 PCRE 所做更改的信息,请参阅 http://pcre.org/original/changelog.txt。此库实现了
re
正则表达式模块的主要部分。自有 ID:OTP-15889
修复了 ID 为 ERL-717 的错误。在此修复之前,函数
io:columns()
和io:rows()
仅在交互式 Erlang shell 中正常工作。在此修复之前,即使 stdout 和 stdin 连接到终端,当从 escript 或使用例如erl -noshell
启动的程序调用这些函数时,它们也会返回{error,enotsup}
。自有 ID:OTP-15959 辅助 ID:ERL-717
修复了通配符中 ".." 和 "@" 的处理。".." 仅当前面有字面模式时才起作用,例如在 "a/.." 中,而不是在前面有通配符字符时,例如在 "*/.." 中。组合 "@/.." 也已损坏,此外,模式中的 "@" 可能会降低通配符匹配的性能。
自有 ID:OTP-15987 辅助 ID:ERL-1029
确保从 shell 调用时,
ets:fun2ms()
可以处理函数头中的++/2
。自有 ID:OTP-15992 辅助 ID:PR-2322
改进和新特性
改进了
gen_statem
中超时的调试。现在,超时启动会在sys:log
和sys:trace
中记录。运行超时在服务器崩溃日志中可见,并且可以使用sys:get_status
查看。由于此原因,添加了系统事件{start_timer, Action, State}
和{insert_timout, Event, State}
,这可能会让依赖于这些事件格式的工具感到意外。新特性:可以使用
{TimeoutType, update, NewEventContent}
更新运行超时的EventContent
。可以使用{TimeoutType, cancel}
取消运行超时,这比使用Time = infinity
更具可读性。* 潜在的不兼容性 *
自有 ID:OTP-15510
re:run()
现在避免在同一次调用中多次验证主题中的 utf8。之前,当传递global
选项时,此验证可能会多次执行。自有 ID:OTP-15831 辅助 ID:ERL-876
启用了
write_concurrency
的 ETSordered_set
表修复了一个性能问题。在此修复之前,内部统计计数器的值没有限制。这可能导致数据结构有时对并行使用它的进程数量的变化反应缓慢。自有 ID:OTP-15906
当传递 ordsets 的长列表时,
ordsets:union/1
现在更快了。自有 ID:OTP-15927
unicode:characters_to_binary()
可能会将非常小的二进制文件作为引用计数的堆外二进制文件返回。这可能会导致不必要的内存使用量和二进制分配器上的不必要负载。现在,小二进制文件始终作为堆二进制文件返回。自有 ID:OTP-16002 辅助 ID:ERIERL-366
当 Erlang (
escript
) 编写的脚本中使用错误的 I/O 服务器时,会显示更有意义的错误消息。自有 ID:OTP-16006 辅助 ID:ERL-992
新特性
ets:info(_, binary)
用于获取表中保留的所有引用计数二进制文件的信息。这与process_info(_, binary)
为进程返回的调试信息类型相同。自有 ID:OTP-16035 辅助 ID:ERIERL-366
更正了有关通过外部格式序列化时编译的匹配规范行为的 ETS 文档。
自有 ID:OTP-16038 辅助 ID:PR-2366
STDLIB 3.9.2
修复的错误和故障
修复了使用控制序列
p
或P
并使用chars_limit
选项限制输出时,格式化术语可能导致循环的错误。自有 ID:OTP-15875 辅助 ID:ERL-967
STDLIB 3.9.1
修复的错误和故障
修复了使用控制序列
p
或P
并使用chars_limit
选项限制输出时,格式化二进制文件可能导致失败的错误。自有 ID:OTP-15847 辅助 ID:ERL-957
STDLIB 3.9
修复的错误和故障
修复了
string:lexemes/2
中的错误。在优化
string
模块中对 Unicode 字符的深层列表的处理时发现了该错误。自有 ID:OTP-15649
修复了
maps
实现中的一个错误,该错误可能导致崩溃或内存使用量增长,直到机器耗尽内存。当将一个包含二进制文件B1
的新键值对,键为K1
插入到具有一个包含二进制文件B2
的键K2
的 mapM
中时,如果满足以下条件,则可能会发生这种情况B1 =/= B2
size(B1) >= 4294967296
size(B2) >= 4294967296
size(M) >= 32
(size(B1) rem 4294967296) == (size(B2) rem 4294967296)
- 在
B1
和B2
中,前(size(B1) rem 4294967296)
个字节相同 - 用
B2
替换K1
中的B1
将创建一个与K2
具有相同值的术语
该问题的根本原因是
maps
实现仅对二进制文件的前(X rem 4294967296)
个字节进行哈希处理,以便不同的二进制文件可以获得相同的哈希值,而与哈希种子无关。自有 ID:OTP-15707
自从引入堆栈跟踪变量以来,Erlang 美化打印机遗漏了异常类
throw
,即使无法省略堆栈跟踪变量,这不是正确的 Erlang 代码。修复方法是始终包含异常类throw
。自有 ID:OTP-15751
record_info/2
是一个伪函数,需要在编译时知道的字面量参数。因此,以下用法是非法的:fun record/info/2
。编译器在编译该类代码时会崩溃。已更正为发出编译错误。自有 ID:OTP-15760 辅助 ID:ERL-907
改进和新特性
实现了一种新的
rand
模块算法,exro928ss
(Xoroshiro928**)。它具有非常长的周期和所有输出位的良好统计质量,同时仍然只比默认算法慢约 50%。相同的生成器也用作
rand
模块的新crypto
插件中的长周期计数器,算法crypto_aes
。此插件使用 AES-256 来加扰计数器,这会掩盖任何可检测到的统计伪影。加扰是以块形式完成的,这些块会被缓存以获得良好的分摊速度(约为默认算法的一半)。自有 ID:OTP-14461 辅助 ID:PR-1857
与服务器命名和启动相关的类型已从
gen_statem
导出。这些是:server_name/0
、server_ref/0
、start_opt/0
、start_ret/0
和enter_loop_opt/0
。自有 ID:OTP-14724 辅助 ID:PR-2056
rand
模块的默认算法已更改为exsss
(Xorshift116**),它是 Xorshift116 (exsp
) 状态更新和 2018 年 David Blackman 和 Sebastiano Vigna 的论文“加扰线性伪随机数生成器”中的新加扰器“StarStar”的组合。这种组合应该不会像之前的默认算法那样存在低位弱的缺陷,代价是速度降低约 10%。请参阅 GitHub pull request #1969。自有 ID:OTP-14731 辅助 ID:PR-1969
通用状态机行为
gen_statem
通过 GitHub Pull Request #1855 进行了代码清理和文档改进,即使 PR 本身被拒绝了。自有 ID:OTP-14737 辅助 ID:PR-1855
将 Unicode 规范更新到 11.0 版本。
自有 ID:OTP-15111
ETS 选项
write_concurrency
现在也影响并提高了ordered_set
表的可伸缩性。该实现基于一种称为竞争自适应搜索树的数据结构,其中锁的粒度适应于应用程序在运行时利用的实际并发量。自有 ID:OTP-15128
使用简单的 Erlang 实现优化了
maps:new/0
,利用不需要动态堆分配的字面量(空映射)。自有 ID:OTP-15200 辅助 ID:PR-1878
gen_*
行为已更改,以便如果服务器启用了通过sys:log/2,3
记录最后 N 条消息,则此日志将包含在终止报告中。为实现此目的,已澄清和清理了
sys
的手册页中定义的“系统事件”格式,添加了新函数sys:get_log/1
,并且sys:get_debug/3
已被弃用。由于这些更改,依赖于“系统事件”内部文档不良格式的代码需要进行更正。* 潜在的不兼容性 *
自有 ID:OTP-15381
gen_statem
行为引擎循环已针对更好的性能进行了优化,特别是在回调模块返回某些操作时,即对于比 Echo Benchmark 更真实的应用程序具有更好的性能。自有 ID:OTP-15452
不允许为驻留在其他模块中的函数指定函数规范。
* 潜在的不兼容性 *
自有 ID:OTP-15563 辅助 ID:ERL-845, OTP-15562
persistent_term
函数put/2
和erase/1
现在会产生结果。自有 ID:OTP-15615
以前,所有 ETS 表都使用集中式计数器变量来跟踪存储的项目数量和消耗的内存量。这些计数器可能会导致可伸缩性问题(尤其是在大型 NUMA 系统上)。此更改添加了分布式计数器的实现,并修改了 ETS 的实现,以便启用了
write_concurrency
的ordered_set
类型的 ETS 表使用分布式计数器。实验表明,在频繁调用ets:insert/2
和ets:delete/2
的场景中,此更改显着提高了启用了write_concurrency
的 ETSordered_set
表的可伸缩性。自有 ID:OTP-15623 辅助 ID:PR-2190
使用
ssh
而不是rsh
作为默认远程 shell。自有 ID:OTP-15633 辅助 ID:PR-1787
添加了
beam_lib:strip/2
及其相关函数,它们接受一个在剥离时应保留的块列表。自有 ID:OTP-15680 辅助 ID:PR-2114
优化了使用
io_lib:write()
打印映射的功能。当使用chars_limit
选项限制输出时,还优化了字符串 (~s
和~ts
) 的美化打印。自有 ID:OTP-15705
有新的编译器选项
nowarn_removed
和{nowarn_removed,Items}
来禁止对已从 OTP 中删除的函数和模块发出警告。自有 ID:OTP-15749 辅助 ID:ERL-904
让 Erlang Pretty Printer 将原子部分放在同一行上。
自有 ID:OTP-15755
将选项
quote_singleton_atom_types
添加到 Erlang Pretty Printer 的函数中。将选项设置为true
会为所有单例原子类型添加引号。自有 ID:OTP-15756
STDLIB 3.8.2.4
修复的错误和故障
[re:run(Subject, RE, [unicode])](
re:run/3
) 在Subject
包含非法 utf8 并且RE
作为二进制传递时返回nomatch
而不是因badarg
错误异常而失败。已对此进行更正,同时更正了re:run()
错误案例中的缩减计数。自有 ID: OTP-16553
STDLIB 3.8.2.3
修复的错误和故障
在 erl_tar 中消除了一个目录遍历漏洞。erl_tar 现在将拒绝提取指向目标提取目录外部的符号链接,并将返回
{error,{Path,unsafe_symlink}}
。(感谢 Eric Meadows-Jönsson 提供的错误报告和修复建议。)自有 ID: OTP-16441
STDLIB 3.8.2.2
修复的错误和故障
修复了使用控制序列
p
或P
并使用chars_limit
选项限制输出时,格式化术语可能导致循环的错误。自有 ID:OTP-15875 辅助 ID:ERL-967
STDLIB 3.8.2.1
修复的错误和故障
修复了使用控制序列
p
或P
并使用chars_limit
选项限制输出时,格式化二进制文件可能导致失败的错误。自有 ID:OTP-15847 辅助 ID:ERL-957
STDLIB 3.8.2
修复的错误和故障
修复了 gen_statem 中的一个错误,由于不正确地使用了异步计时器取消,内部超时消息可能会在高负载期间作为信息到达回调模块。
自有 ID:OTP-15295
STDLIB 3.8.1
修复的错误和故障
修复了读取使用
compressed
标志打开的文件时的性能回归。自有 ID:OTP-15706 辅助 ID:ERIERL-336
STDLIB 3.8
修复的错误和故障
修复了 Erlang Pretty Printer 中的一个错误:长原子名称与
<<>>
结合使用可能会导致崩溃。自有 ID:OTP-15592 辅助 ID:ERL-818
修复了使用控制序列
p
或P
格式化字符列表并使用选项chars_limit
限制输出时可能导致错误结果或性能不佳的错误。自有 ID:OTP-15639
改进和新功能
改进了关于安全表遍历和
ordered_set
部分绑定键优化的 ETS 文档。自有 ID:OTP-15545 辅助 ID:PR-2103, PR-2139
优化了
calendar:gregorian_days_to_date/1
。自有 ID:OTP-15572 辅助 ID:PR-2121
优化了函数
calendar:rfc3339_to_system_time()
和calendar:system_time_to_rfc3339()
。自有 ID:OTP-15630
STDLIB 3.7.1
修复的错误和故障
优化了术语的美化打印。较慢的行为是在 Erlang/OTP 20 中引入的。
自有 ID:OTP-15573 辅助 ID:ERIERL-306
STDLIB 3.7
修复的错误和故障
在匹配规范中记录
bit_size
并允许在ets:fun2ms
中使用它。自有 ID:OTP-15343 辅助 ID:PR-1962
beam_lib
中的beam()
类型定义为module() | file:filename() | binary()
。module/0
具有误导性。如果 BEAM 文件位于当前目录中,则将模块名称作为原子给出才有效。为了避免混淆,已从类型中删除
module/0
。这意味着对于使用原子作为文件名调用beam_lib
的代码,Dialyzer 将发出警告,但调用仍将有效。自有 ID:OTP-15378 辅助 ID:ERL-696
unicode_util
在二进制字符串中的某些表情符号字形簇上崩溃。自有 ID:OTP-15428 辅助 ID:ERL-777
当使用外部函数时,可以禁止对未使用变量的警告。
自有 ID:OTP-15437 辅助 ID:ERL-762
修复 lists:member/2 中的归约计数
自有 ID:OTP-15474 辅助 ID:ERIERL-229
改进和新功能
如果指定,
+{source,Name}
选项现在将覆盖堆栈跟踪中的实际文件名,而不仅仅影响Mod:module_info()
的返回值。+deterministic
标志现在也会影响堆栈跟踪,省略除文件名以外的所有路径信息,从而解决了一个长期存在的问题,即确定性构建需要确定性路径。自有 ID:OTP-15245 辅助 ID:ERL-706
列表减法(
--
运算符)现在将在大型输入上正确产生结果。自有 ID:OTP-15371
calendar:system_time_to_rfc3339/1,2
不再从分数中删除尾随零。自有 ID:OTP-15464
STDLIB 3.6
修复的错误和故障
修正了
filename:basedir/2,3
的规范。自有 ID: OTP-15252 辅助 ID: ERL-667
改进和新功能
如果给定的原始文件名(二进制文件),让
dets:open_file()
以badarg
消息退出。自有 ID: OTP-15253 辅助 ID: OTP-13229, ERL-55
即使格式化函数在模块
io
和io_lib
中的Format
参数是二进制列表等类型,也会被接受。这与 Erlang/OTP 21.0 之前的行为一致。自有 ID: OTP-15304
STDLIB 3.5.1
修复的错误和故障
修复了一个当使用控制序列
p
或P
格式化非字符列表并使用chars_limit
选项限制输出时可能导致崩溃的错误。自有 ID: OTP-15159
STDLIB 3.5
修复的错误和故障
gen_statem
的改进。当使用状态进入调用中有效但不允许的异常时,原因已从
{bad_action_from_state_function,Action}
更改为{bad_state_enter_action_from_state_function,Action}
。改进了定时器解析。许多错误的超时元组没有被正确处理。
文档已更新,特别是用户指南以及从参考手册到它的指针更加明显。
自有 ID: OTP-14015
根据文件和套接字操作应返回的错误,更新了
file:posix/0
和inet:posix/0
的类型规范。自有 ID: OTP-14019 辅助 ID: ERL-550
文件操作过去接受包含空字符(整数值零)的文件名。这会导致名称被截断,并在某些情况下导致原始操作的参数被混淆。现在拒绝文件名中包含空字符的文件名,并会导致原始文件操作失败。
此外,环境变量操作过去接受包含空字符(整数值零)的环境变量的名称和 值。这会导致操作静默地产生错误的结果。现在拒绝名称或值中包含空字符的环境变量名称和值,并会导致环境变量操作失败。
原始环境变量操作过去还接受环境变量名称中的
$=
字符,从而导致各种问题。现在也拒绝环境变量名称中的$=
字符。erlang:open_port/2
从现在开始也将拒绝端口名称内的空字符。* 潜在的不兼容性 *
自有 ID: OTP-14543 辅助 ID: ERL-370
使
io_lib:unscan_format/1
可以使用填充字符和默认精度。自有 ID: OTP-14958 辅助 ID: PR-1735
控制序列修饰符
t
和l
可以在同一控制序列中一起使用,这使得可以同时拥有 Unicode 原子且不检测可打印字符列表。自有 ID: OTP-14971 辅助 ID: PR-1743
修复了 Erlang 代码 linter 中的一个错误:如果使用了 map 语法,则对 guard 表达式的检查不再返回
false
。此错误影响了 Erlang shell、Debugger 和其他评估抽象代码的模块。自有 ID: OTP-15035 辅助 ID: ERL-613
类型为 {Fun,State} 的系统调试函数不应被安装两次。但是,如果当前状态为 'undefined',则可能发生这种情况,因为该状态被误认为是不存在的函数。这已得到纠正。
自有 ID: OTP-15049
修复了错误时
io:putchars/2
堆栈跟踪重写以指向有效函数的问题。自有 ID: OTP-15101
改进和新功能
gen_server
获得了一个新的回调handle_continue/2
,用于检查点状态。这在至少在gen_server
之上实现行为以及某些启动场景时很有用。自有 ID: OTP-13019 辅助 ID: PR-1490
gen_statem:call/3
的超时参数{clean_timeout,infinity}
的语义已更改为使用代理进程进行调用。通过此更改,clean_timeout
表示不带异常的代理进程。这可能是一个难以观察到的不兼容性:在存在网络问题的情况下,当捕获错误时,延迟的回复可能会到达调用者的消息队列中。此更正后不会发生这种情况。超时参数
infinity
的语义未更改。* 潜在的不兼容性 *
自有 ID: OTP-13073 辅助 ID: PR-1595
Erlang/OTP 中添加了一个新的日志记录 API,请参阅
logger
手册页,以及内核用户指南中的 日志记录 部分。对
error_logger
的调用会自动重定向到新的 API,并且仍然可以使用旧版错误记录器事件处理程序。但是,建议在编写新代码时直接使用 Logger API。请注意以下潜在的不兼容性
内核配置参数
error_logger
仍然有效,但如果默认处理程序的输出目标配置了内核配置参数logger
,则会被覆盖。通常,用于配置错误记录器的参数会被用于配置 Logger 的新参数覆盖。
SASL 错误日志记录的概念已弃用,这意味着默认情况下,SASL 应用程序不会影响记录哪些日志事件。
默认情况下,supervisor 报告和崩溃报告由内核启动的默认 Logger 处理程序记录,并最终与来自 Erlang/OTP 的其他标准日志事件位于同一目标位置(终端或文件)。
默认情况下不记录进度报告,但可以通过将主日志级别设置为 info 来启用,例如使用内核配置参数
logger_level
。要获得与早期版本中的 SASL 错误日志记录功能向后兼容的功能,请将内核配置参数
logger_sasl_compatible
设置为true
。这可以防止默认 Logger 处理程序记录任何 supervisor、崩溃或进度报告。相反,SASL 在应用程序启动期间添加一个单独的 Logger 处理程序,该处理程序负责这些日志事件。SASL 配置参数sasl_error_logger
和sasl_errlog_type
指定这些事件的记录目标(终端或文件)和严重性级别。
由于 Logger 是 Erlang/OTP 21.0 中的新功能,因此我们保留在此版本之后的补丁中对 Logger API 和功能进行更改的权利。这些更改可能与初始版本向后兼容,也可能不兼容。
* 潜在的不兼容性 *
自有 ID: OTP-13295
添加函数
calendar:system_time_to_local_time/2
和calendar:system_time_to_universal_time/2
。自有 ID: OTP-13413
添加了函数
rand:uniform_real/0
和rand:uniform_real_s/1
。它们生成0.0 =< X < 1.0
范围内的均匀分布的数字,这些数字尽可能接近标准化 IEEE 754 双精度允许的随机实数。由于随机实数正好是0.0
是无限不可能的,因此它们永远不会完全返回0.0
。当需要对随机值
X
调用例如math:log(X)
或1 / X
时,这些属性很有用,因为使用这些新函数生成的数字永远不会失败。自有 ID: OTP-13764 辅助 ID: PR-1574
添加了 maps:iterator/0 和 maps:next/1,用于遍历映射中的键值关联。
自有 ID: OTP-14012
更改了
.erlang
加载的默认行为:不再从当前目录加载.erlang
。c:erlangrc(PathList)
可用于从用户指定的目录搜索和加载.erlang
文件。escript
、erlc
、dialyzer
和typer
不再加载.erlang
。* 潜在的不兼容性 *
自有 ID: OTP-14439
向 stdlib 添加了新的 uri_string 模块,用于处理 URI (RFC 3986)。
自有 ID: OTP-14496
将 Unicode 规范更新到 10.0 版本。
自有 ID: OTP-14503
filelib:wildcard()
现在允许使用反斜杠转义具有特殊含义的字符。这是一个不兼容的更改,但请注意,在通配符中使用反斜杠在 Windows 和 Unix 上已经以不同的方式工作。需要更新对
filelib:wildcard()
的现有调用。在 Windows 上,目录分隔符必须始终写为斜杠。* 潜在的不兼容性 *
自有 ID: OTP-14577
supervisor 现在将子规范存储在映射中,而不是列表中。当在非 simple_one_for_one supervisor 下启动许多子项时,这会带来显着改进。
自有 ID: OTP-14586
优化了
base64
模块。请注意,除非使用文档中指定的类型的参数调用函数
encode/1
、decode/1
和mime_decode/1
,否则它们会失败。它们过去接受任何iodata/0
。自有 ID: OTP-14624 辅助 ID: PR-1565
添加函数
lists:search/2
。自有 ID: OTP-14675 辅助 ID: PR-102
uri_string 模块扩展了用于处理基于 HTML5 规范的 application/x-www-form-urlencoded 查询字符串的函数。
自有 ID: OTP-14747
添加函数
calendar:rfc3339_to_system_time/1,2
和calendar:system_time_to_rfc3339/1,2
。内部 ID:OTP-14764
erl_eval
模块的函数返回的堆栈跟踪更能准确地反映异常发生的位置。内部 ID:OTP-14826 辅助 ID:PR 1540
向
erl_tar:add/3,4
函数添加选项atime
、mtime
、ctime
、uid
和gid
。内部 ID:OTP-14834 辅助 ID:PR 1608
添加了
ets:whereis/1
,用于检索命名表的表标识符。内部 ID:OTP-14884
改进了 uri_string 模块中的 URI 规范化函数。
内部 ID:OTP-14910
新函数
io_lib:fwrite/3
和io_lib:format/3
接受第三个参数,一个选项列表。唯一的选项是chars_limit
,用于限制返回的字符数。该限制是软性的,这意味着返回的字符数最多只会略微超出限制。如果设置了限制,函数format/3
和fwrite/3
将尝试在控制序列pPswW
中均匀分布字符数。此外,控制序列pPwP
将尝试在子结构中均匀分布字符数。控制序列
pPwW
的一个修改是,即使返回的字符数没有限制,也会将映射的所有关联打印到相同的深度。目的是在映射键的顺序未定义的情况下提供更一致的输出。和之前一样,如果深度小于映射的关联数,则要打印的关联的选择是任意的。内部 ID:OTP-14983
添加函数
ordsets:is_empty/1
和sets:is_empty/1
。内部 ID:OTP-14996 辅助 ID:ERL-557, PR-1703
改进了处理 ASCII 字符时
string:uppercase/1
、string:lowercase/1
和string:casefold/1
的性能。内部 ID:OTP-14998
模块、名称和元数具有字面值的外部函数(例如
erlang:abs/1
)现在被视为字面值。这意味着更高效的代码,在堆上产生更少的垃圾。内部 ID:OTP-15003
sys:statistics(Pid,get) 不会报告来自 gen_server 的“out”消息。现在已更正。
内部 ID:OTP-15047
sys 调试函数现在除了旧的 {Fun,State} 格式之外,还可以使用 {Id,Fun,State} 格式。这允许安装调试函数的多个实例。
内部 ID:OTP-15048
lib
模块已删除。lib:error_message/2
已删除。lib:flush_receive/0
已删除。lib:nonl/1
已删除。lib:progname/0
已被ct:get_progname/0
取代。lib:send/2
已删除。lib:sendw/2
已删除。
* 潜在的不兼容性 *
内部 ID:OTP-15072 辅助 ID:PR 1786, OTP-15114
函数
ets:delete_all_objects/1
现在为需要大量时间清除的大型表让出调度程序线程。这是为了提高其他可运行进程的实时特性。内部 ID:OTP-15078
在包含
p
或P
的函数io:fwrite/2,3
和io_lib:fwrite/2,3
的控制序列中,字段宽度值为0
表示不插入换行符。这与旧的行为相反,旧的行为中0
会在每个子项后插入换行符。要在每个子项后插入换行符,可以使用字段宽度值1
。* 潜在的不兼容性 *
内部 ID:OTP-15103 辅助 ID:ERL-607
STDLIB 3.4.5.1
改进和新功能
列表减法(
--
运算符)现在将在大型输入上正确产生结果。自有 ID:OTP-15371
STDLIB 3.4.5
修复的 Bug 和故障
gen_statem
中的Module:init/1
函数可能会返回一个包含任何操作的操作列表,但是错误的检查只允许状态进入操作,例如{next_event,internal,event}
导致服务器崩溃。此 Bug 已修复。内部 ID:OTP-13995
STDLIB 3.4.4
修复的 Bug 和故障
更正
filelib:find_source()
和filelib:find_file()
,使其默认也在src
下的一级目录中搜索。这符合设计原则,该原则规定应用程序可以在src
目录下一级目录中包含 Erlang 源文件。内部 ID:OTP-14832 辅助 ID:ERL-527
更正了
erl_tar:table/2
的约定。内部 ID:OTP-14860 辅助 ID:PR 1670
更正了一些约定。
内部 ID:OTP-14889
修复 string:prefix/2 以处理空字符串作为第二个参数。
内部 ID:OTP-14942 辅助 ID:PR-1702
STDLIB 3.4.3
修复的 Bug 和故障
使
ets:i/1
在浏览表时输入 ^D 时更干净地退出。仅影响旧的 Erlang shell(erl 标志-oldshell
)。内部 ID:OTP-14663
修复了
filename
模块中 Windows UNC 路径的处理。内部 ID:OTP-14693
改进和新功能
改进了处理 ASCII 字符时新字符串功能的性能。
内部 ID:OTP-14670
向
unicode:characters_to_list/2
的文档添加了说明。内部 ID:OTP-14798
STDLIB 3.4.2
修复的 Bug 和故障
修复了 Erlang shell 中的一个 Bug,其中具有类型化字段的递归定义的记录可能会导致循环。
内部 ID:OTP-14488 辅助 ID:PR-1489
使 edlin 处理字素簇而不是代码点,以改进对多代码点字符的处理。
内部 ID:OTP-14542
当使用多个
catch
子句时,可能会出现erlang:get_stacktrace/0
在try
块外部使用的错误警告。内部 ID:OTP-14600 辅助 ID:ERL-478
改进和新功能
Erlang 代码 linter 不再检查
nowarn_deprecated_function
选项中提到的函数是否在模块中声明。内部 ID:OTP-14378
一般的 Unicode 改进。
内部 ID:OTP-14462
STDLIB 3.4.1
修复的 Bug 和故障
更正了 Erlang/OTP 20.0 中引入的
proc_lib:format()
中的一个 Bug。内部 ID:OTP-14482 辅助 ID:PR-1488
修复 string:len/1 以与以前的版本兼容。
内部 ID:OTP-14487 辅助 ID:ERIERL-40
在 OTP-20.0 中,c、make 和 ct_make 的行为发生了更改,因此在某些情况下,beam 文件默认会写入找到源文件的目录中。现在已改回旧的行为,因此 beam 文件默认写入当前目录。
内部 ID:OTP-14489 辅助 ID:ERL-438
STDLIB 3.4
修复的 Bug 和故障
在许多版本中,使用具有相同名称的局部函数覆盖 BIF 是合法的。但是,不允许在列表理解中将与 guard BIF 同名的局部函数作为过滤器调用。
内部 ID:OTP-13690
在
rand
模块中实现了一种新的(默认)伪随机数生成器算法 Xoroshiro116+。旧的算法实现存在许多缺陷,因此它们都被弃用了,但添加了其中两个的更正版本。请参阅文档。
内部 ID:OTP-14295 辅助 ID:PR-1372
Erlang shell、
qlc:string_to_handle()
和调试器(Bindings 区域的 Evaluator 区域和 Edit variable 窗口)可以解析 pid、端口、引用和外部函数,只要它们可以在运行的系统中创建即可。内部 ID:OTP-14296
内部代码更改:对
catch
的调用后跟对erlang:get_stacktrace/0
的调用已重写为使用try
而不是catch
,以使代码具有面向未来的能力。内部 ID:OTP-14400
ms_transform
模块,由ets:fun2ms/1
和dbg:fun2ms/1
使用,计算常量算术表达式。这是必要的,因为 Erlang 编译器(通常计算常量表达式)不识别ms_transform
生成的格式。内部 ID:OTP-14454 辅助 ID:ERIERL-29
状态机引擎
gen_statem
现在可以处理通用超时(多个命名)以及绝对超时时间。请参阅文档。gen_statem
回调Module:init/1
已成为强制性的,以便与其他gen_*
模块保持一致。对于使用gen_statem:enter_loop/4-6
的gen_statem
回调模块,这可能是不兼容的。* 潜在的不兼容性 *
内部 ID:OTP-14531
改进和新功能
改进了对字符串的 Unicode 支持。在
unicode
模块中添加了规范化函数。使用改进的 Unicode 处理和处理字素簇的新函数扩展了string
模块 API。新函数对unicode:chardata()
类型进行操作,因此它们也接受UTF-8 二进制
作为输入。旧的字符串 API 已被标记为已过时。某些错误情况的返回值已更改。
* 潜在的不兼容性 *
内部 ID:OTP-10289 辅助 ID:OTP-10309
有两个新的 guard BIF '
floor/1
' 和 'ceil/1
'。它们都返回整数。在 'math
' 模块中,有两个同名的新 BIF,它们返回浮点值。内部 ID:OTP-13692
使 OTP 行为中的 code_change、terminate 和 handle_info 回调成为可选的。
内部 ID:OTP-13801
删除了对使用 Erlang/OTP R7 及更早版本创建的 Dets 文件的支持。
内部 ID:OTP-13830
替换了已弃用的符号
time unit
表示的使用。内部 ID:OTP-13831 辅助 ID:OTP-13735
函数
fmod/2
已添加到math
模块。自有 ID: OTP-14000
从使用
proc_lib
的进程接收到的 EXIT 信号现在看起来像使用spawn_link
生成的进程发出的 EXIT 信号。特别是,这意味着堆栈跟踪现在包含在 EXIT 信号中,以便它可以查看进程崩溃的位置。自有 ID: OTP-14001
当添加已存在的元素时,
sets:add_element/2
的速度更快;当要删除的元素不存在时,sets:del_element/2
的速度更快。这种优化可以使某些操作,例如具有许多重叠元素的 sets:union/2,速度提高多达两个数量级。自有 ID: OTP-14035
在文档中添加了有关达到最大重启频率时 supervisor 关闭原因的信息。
自有 ID: OTP-14037 辅助 ID: PR-1233
添加了
rand:jump/[0|1]
函数。自有 ID: OTP-14038 辅助 ID: PR-1235
添加了用于检测已更改代码的函数。
code:modified_modules/0
返回所有当前已加载的、在磁盘上已更改的模块。code:module_status/1
返回模块的状态。在 shell 和c
模块中,mm/0
是code:modified_modules/0
的缩写,lm/0
重新加载所有当前已加载的、在磁盘上已更改的模块。自有 ID: OTP-14059
assert.hrl
中的每个断言宏现在都有一个带有额外参数的对应版本,用于向断言添加注释。例如,这些可以作为错误报告的一部分打印,以阐明失败检查的含义。自有 ID: OTP-14066
为了提高可读性,并且为了不更改消息末尾的行终止属性,
error_logger_tty_h
和error_logger_file_h
现在将非本地消息的节点信息插入到消息本身之前,而不是之后。自有 ID: OTP-14068
Erlang 代码 linter 检查格式错误的类型约束。
自有 ID: OTP-14070 辅助 ID: PR-1214
默认情况下,现在使用
export_all
时会发出警告。可以使用nowarn_export_all
禁用该警告。自有 ID: OTP-14071
当
gen_server
进程崩溃时,将打印客户端的堆栈跟踪,以方便调试。自有 ID: OTP-14089
通过将表标识符类型从整数更改为引用来优化 ETS 操作。引用可以更直接地映射到表,减少了潜在的锁争用,并且使表的创建和删除更具可伸缩性。
ETS 表标识符的不透明类型更改可能会导致对这种不透明类型做出错误假设的代码失败。
注意
在单个 Erlang 节点上存储的表数量曾经是有限的。现在不再是这种情况(除了受内存使用限制)。先前的默认限制约为 1400 个表,可以通过在启动 Erlang 运行时系统之前设置环境变量
ERL_MAX_ETS_TABLES
来增加。这个硬性限制已被删除,但目前仍然建议设置ERL_MAX_ETS_TABLES
。应将其设置为使用的最大表数量的近似值。这是因为命名表的内部表是使用该值来确定大小的。如果使用大量命名表,并且没有增加ERL_MAX_ETS_TABLES
,命名表查找的性能将会降低。* 潜在的不兼容性 *
自有 ID: OTP-14094
take/2
已添加到dict
、orddict
和gb_trees
。take_any/2
已添加到gb_trees
。自有 ID: OTP-14102
扩展 gen_event API 以处理选项。
自有 ID: OTP-14123
关于如何调整 supervisor 重启频率(强度和周期)的建议已添加到系统文档 - 设计原则 - Supervisor 行为。
自有 ID: OTP-14168 辅助 ID: PR-1289
gen_fsm 已被弃用,并被 gen_statem 取代,但出于向后兼容性的原因,gen_fsm 可能会作为未记录的功能存在相当长的一段时间。
自有 ID: OTP-14183
shell 函数
c/1
和c/2
已被扩展,以便如果参数是模块名称而不是文件名,它会自动查找 .beam 文件和相应的源文件,然后使用相同的编译器选项(加上传递给 c/2 的任何选项)重新编译该模块。如果编译失败,则保留旧的 beam 文件。还添加了c(Mod, Opts, Filter)
,其中 Filter 参数允许您在添加新选项之前删除旧的编译器选项。新的实用函数
file_find/2/3
和find_source/1/2/3
已添加到filelib
。自有 ID: OTP-14190
在以前版本的 OTP 中,
erl_tar
仅支持 USTAR 格式。这将路径名限制为最多 255 个字节,并且不支持以可移植的方式在名称中使用 Unicode 字符。erl_tar
现在支持读取当前常用的格式的 tar 存档,例如 v7、STAR、USTAR、PAX 和 GNU tar 对 STAR/USTAR 格式的扩展。在写入 tar 存档时,如果需要(例如,为了支持非常长的文件名或带有 Unicode 字符的文件名),erl_tar
现在可以用PAX
格式写入它们。如果可能,erl_tar
仍将以 USTAR 格式写入 tar 存档,以实现最大的可移植性。自有 ID: OTP-14226
base64:mime_decode/1
已经过优化,现在几乎与base64:decode/1
一样快;它以前明显较慢。自有 ID: OTP-14245
现在,
erl_tar
将在从 tar 存档中提取文件时删除路径名中任何开头 '/
',并将消息写入错误记录器。还新增了对目录遍历攻击的检查;如果相对路径指向当前工作目录之上,则提取将中止。自有 ID: OTP-14278
由于原子包含任意 Unicode 字符,进行了各种更新。
自有 ID: OTP-14285
Crypto 应用程序现在支持生成密码学上强大的随机数(浮点数 < 1.0 和任意范围的整数),作为 'rand' 模块的插件。
自有 ID: OTP-14317 辅助 ID: PR-1372
添加新函数
ets:select_replace/2
,它使用匹配规范对 ETS 对象执行原子“比较并交换”操作。自有 ID: OTP-14319 辅助 ID: PR-1076
Erlang 代码 linter 检查错误的
dialyzer
属性。它还检查类型声明中的错误类型变量。自有 ID: OTP-14323
在
rand
模块中实现了两个新函数;normal/2
和normal_s/3
,它们都根据参数生成具有平均值和方差的正态分布(伪)随机数。自有 ID: OTP-14328 辅助 ID: PR-1382
将 OTP 内部 PCRE 库从 8.33 版本升级到 8.40 版本。该库用于实现
re
正则表达式模块。除了各种错误修复之外,新版本还允许更好的堆栈保护。为了利用此功能,所有平台上普通调度程序线程的堆栈大小现在默认设置为 128 千字节。普通调度程序线程的堆栈大小可以在系统启动时通过将
+sss
命令行参数传递给erl
命令来设置。有关在 8.33 和 8.40 版本之间对 PCRE 所做的更改的信息,请参阅 http://pcre.org/original/changelog.txt。
* 潜在的不兼容性 *
自有 ID: OTP-14331 辅助 ID: ERL-208
添加了函数
re:version/0
,它返回有关用于实现re
模块的 OTP 内部 PCRE 版本的信息。自有 ID: OTP-14347 辅助 ID: PR-1412
存储在 BEAM 文件中的调试信息(当使用
debug_info
时)的格式已更改。更改的目的是更好地支持其他基于 BEAM 的语言,例如 Elixir 或 LFE。OTP 中包含的所有工具(dialyzer、debugger、cover 等)都将处理新格式和以前的格式。使用
beam_lib:chunk(Beam, [abstract_code])
检索调试信息的工具将继续使用新格式和旧格式。调用beam_lib:chunk(Beam, ["Abst"])
的工具将无法使用新格式。有关更多信息,请参阅
beam_lib
文档中debug_info
的描述以及compile
文档中{debug_info,{Backend,Data}}
选项的描述。自有 ID: OTP-14369 辅助 ID: PR-1367
将 hibernate_after 选项添加到 gen_server、gen_statem 和 gen_event。还添加到了已弃用的 gen_fsm 行为中。
自有 ID: OTP-14405
由
gen_server
、gen_statem
和proc_lib
创建的崩溃报告的大小受 Kernel 应用程序变量error_logger_format_depth
的限制。目的是限制当具有大量消息队列或状态的进程崩溃时发送到error_logger
进程的消息的大小。由
proc_lib
生成的崩溃报告包括新的标签message_queue_len
。邻居报告还包括新的标签current_stacktrace
。最后,邻居报告不再包括标签messages
和dictionary
。可以使用新函数
error_logger:get_format_depth/0
来检索 Kernel 应用程序变量error_logger_format_depth
的值。自有 ID: OTP-14417
STDLIB 3.3
已修复的错误和故障
只有两行的 escript 无法工作。
自有 ID: OTP-14098
字符 (
$char
) 可以在常量模式表达式中使用。它们也可以在类型和合约中使用。自有 ID: OTP-14103 辅助 ID: ERL-313
erl_parse:anno_to_term/1
和erl_parse:anno_from_term/1
的签名已更正。使用这些函数不再会导致 Dialyzer 发出错误的警告。自有 ID: OTP-14131
改进了映射的漂亮打印。
自有 ID: OTP-14175 辅助 ID: seq13277
如果
zip
模块中的以下任何函数崩溃,则会留下一个打开的文件:extract()
、unzip()
、create()
或zip()
。此问题已得到纠正。无法解压缩具有“Unix 标头”的
zip
文件。自有 ID: OTP-14189 辅助 ID: ERL-348, ERL-349
改进了 Erlang shell 对长名称的制表符补全。
自有 ID: OTP-14200 辅助 ID: ERL-352
sys
的参考手册中关于进程使用的“get_modules”消息存在一些错误信息,这些进程在运行时会动态更改模块。文档现已更正。自有 ID: OTP-14248 辅助 ID: ERL-367
改进和新功能
gen_statem 的错误修复、新功能和改进
新的类型 init_result/1 已经取代了旧的 init_result/0,因此如果您使用了旧的类型(从未记录在文档中),则必须更改您的代码,这可能被视为潜在的不兼容性。
代码更改后,更改回调模式不起作用,因为没有记录新的回调模式。此错误已修复。
事件类型 state_timeout 和 {call,From} 无法通过 {next_event,EventType,EventContent} 操作生成,因为它们没有通过运行时类型检查。此错误现已更正。
现在可以使用(新的)状态回调返回 {repeatstate,...}, {repeat_state_and_data,} 和 repeat_state_and_data 来重复状态条目调用。
已经进行了大量的代码清理,特别是关于计时器处理。例如,现在使用异步 cancel_timer。错误处理也得到了清理。
为了与 gen_* 的其余部分未来可能发生的变化保持一致,terminate/3 现在有了回退,而 code_change/4 不是强制性的。
自有 ID: OTP-14114
添加了
filename:safe_relative_path/1
来清理相对路径。自有 ID: OTP-14215
STDLIB 3.2
修复的错误和故障
当 simple_one_for_one supervisor 关闭时,并且子进程以 {shutdown, Term} 形式的退出原因退出时,之前会打印错误报告。此问题现已更正。
自有 ID: OTP-13907 辅助 ID: PR-1158, ERL-163
允许将空列表作为与
dbg:fun2ms/1
一起使用的 fun 的参数。自有 ID: OTP-13974
改进和新功能
新的行为 gen_statem 已经改进了 3 个新功能:可以对 gen_statem:call/2,3、状态条目代码和状态超时使用旧式非代理超时。这些是向后兼容的。已经进行了小的代码和文档改进,包括对超时零处理的边界语义修正。
自有 ID: OTP-13929 辅助 ID: PR-1170, ERL-284
STDLIB 3.1
修复的错误和故障
zip:unzip/1,2
和zip:extract/1,2
函数已更新以处理目录遍历漏洞。zip 文件中任何包含指向顶层工作目录cwd
上方目录的路径的元素,都将在cwd
中提取。在解压缩操作期间,将为 zip 文件中的任何此类元素打印错误消息。keep_old_files
选项确定文件是否会覆盖 zip 文件中先前同名的文件。自有 ID: OTP-13633
更正了
ets:match_object/1,3
的合约。自有 ID: OTP-13721 辅助 ID: PR-1113
来自 bugs.erlang.org 的 Jira 案例 ERL-172 和 ERL-187 中,修复了
gen_statem:code_change/4
的类型规范和 Emacs 模板生成中的错误。自有 ID: OTP-13746 辅助 ID: ERL-172, ERL-187
改进和新功能
gen_statem 已更改为将服务器的回调模式设置为 Module:callback_mode/0 返回的值。这有助于代码降级,因为回调模式现在成为当前活动代码的属性,而不是服务器进程的属性。
还改进了 Module:init/1 的异常处理。
* 潜在的不兼容性 *
自有 ID: OTP-13752
STDLIB 3.0.1
修复的错误和故障
修复了 Erlang shell 中关于类型记录的错误。该错误是在 OTP-19.0 中引入的。
自有 ID: OTP-13719 辅助 ID: ERL-182
STDLIB 3.0
修复的错误和故障
修复了影响
dets:open_file/2
的竞争错误。自有 ID: OTP-13260 辅助 ID: seq13002
不要搜索不存在的 Map 键两次
对于
maps:get/2,3
和maps:find/2
,在小型映射中搜索即时键(例如原子)时,如果该键不存在,则会执行两次搜索。自有 ID: OTP-13459
避免在 Solaris 上出现零星的极端情况数学错误,例如,当不应该出现时,exp() 和 pow() 中的下溢会抛出错误。
自有 ID: OTP-13531
修复映射键变量的 linting
映射键不能取消绑定,然后用于并行匹配。
示例:
#{ K := V } = #{ k := K } = M.
如果'K'
未绑定,则此操作是非法的。自有 ID: OTP-13534 辅助 ID: ERL-135
修复了 openbsd 中 re 的一个错误,有时 re:run 会返回不正确的结果。
自有 ID: OTP-13602
为避免 supervisor 重启时潜在的计时器瓶颈,当 supervisor 无法重启子进程时,不再使用计时器服务器。
自有 ID: OTP-13618 辅助 ID: PR-1001
Erlang 代码预处理器 (
epp
) 可以处理跨多个标记的文件名。示例:-include("a" "file" "name").
。自有 ID: OTP-13662 辅助 ID: seq13136
改进和新功能
erl_parse
模块中抽象格式的类型已得到改进。自有 ID: OTP-10292
已删除(未经弃用)函数规范的未记录语法
-spec F/A :: Domain -> Range
。不再记录使用
is_subtype(V, T)
语法进行约束(在函数规范中),而应使用较新的语法V :: T
。Erlang 解析器仍然识别is_subtype
语法,并且会在一段时间内继续这样做。* 潜在的不兼容性 *
自有 ID: OTP-11879
“
random
”模块已弃用。请改用“rand
”模块。自有 ID: OTP-12502 辅助 ID: OTP-12501
背景:在带有类型声明但没有初始化器的记录字段中,如果该值不存在,Erlang 解析器会自动将单例类型
'undefined'
插入到声明的类型列表中。也就是说,记录声明-record(rec, {f1 :: float(), f2 = 42 :: integer(), f3 :: some_mod:some_typ()}).
由解析器转换为
-record(rec, {f1 :: float() 'undefined', f2 = 42 :: integer(), f3 : some_mod:some_typ() 'undefined'}). 这样做的理由是,创建“虚拟”
#rec{}
记录不应导致 dialyzer 发出警告,例如,#rec.f1
字段的隐式初始化违反其类型声明。问题:这个看似无害的操作有一些意想不到的后果。
首先,当此字段没有“明显的”默认初始化器时,程序员无法声明例如只有浮点数对
#rec{}
记录的f1
字段有意义。(这也影响了 PropEr 等工具,这些工具使用 Erlang 解析器生成的这些声明来生成用于测试目的的随机记录实例。)这也意味着,如果例如对
f1
字段的值执行is_atom/1
测试或更奇特的类似atom_to_list/1
的调用,dialyzer 不会发出警告。类似地,如果发现 record 构造其中
f1
没有初始化为某个浮点数,则无法扩展 dialyzer 以发出警告。最后但并非最不重要的一点是,当字段的类型是不透明类型时,语义上存在问题:创建不透明类型和结构化类型的联合对于分析来说非常棘手,因为它从根本上破坏了该点的术语的不透明性。
更改:为解决这些问题,解析器将不再自动插入
'undefined'
值;相反,用户可以选择此值有意义(对于字段)和没有意义的地方,并在那里手动插入| 'undefined'
。此变更的后果:此变更意味着,对于所有创建带有未初始化字段的记录且这些字段的声明类型与
'undefined'
不兼容(例如,float/0
)的地方,Dialyzer 将发出警告。可以通过在字段的类型中添加| 'undefined'
来轻松抑制此警告。这还表明用户确实打算创建此字段未初始化的记录。* 潜在的不兼容性 *
自有 ID: OTP-12719
移除模块
erl_scan
和erl_parse
中已弃用的函数。自有 ID: OTP-12861
预处理器现在可以展开 ?FUNCTION_NAME 和 ?FUNCTION_ARITY 宏。
自有 ID: OTP-13059
已经实现了一个新的行为
gen_statem
。它已经过彻底审查,足够稳定,至少可以被两个重型 OTP 应用程序使用,并且将长期存在。但是,根据用户反馈,我们不期望但可能会发现有必要在 OTP-20.0 中进行小的向后不兼容的更改,因此其状态可以被指定为“不太实验性”……gen_statem
行为旨在取代gen_fsm
用于新代码。它具有相同的功能,并添加了一些非常有用的功能- 状态代码被收集
- 状态可以是任何项
- 事件可以被延迟
- 事件可以自我生成
- 可以从以后的状态发送回复
- 可以有多个 sys 可追踪的回复
gen_statem
的回调模型与gen_fsm
的回调模型不同,但是从gen_fsm
重写到gen_statem
仍然相当容易。自有 ID: OTP-13065 辅助 ID: PR-960
使用原生 BIF 实现优化 binary:split/2 和 binary:split/3。
自有 ID: OTP-13082
背景:自 R12B 以来,记录字段的类型已由
epp:parse_file()
放入单独的形式,使记录声明形式不带类型。但是,单独的形式不遵循类型声明的语法,并且检查-type()
属性的解析转换需要了解特殊语法。由于编译器将epp:parse_file()
的返回值作为调试信息存储在抽象代码块("Abst"
或abstract_code
)中,因此如果工具检查抽象代码中的-type()
属性,它们也需要了解特殊语法。变更:
epp:parse_file()
不会创建单独的类型形式,但类型信息会保留在记录字段中。这意味着,所有解析转换和所有检查-record()
声明的工具都需要识别{typed_record_field, Field, Type}
。* 潜在的不兼容性 *
自有 ID: OTP-13148
现在禁止在二进制生成器中使用
bytes
类型的无尺寸字段。(其他编写无尺寸字段的方式,例如binary
,已经被禁止。)自有 ID: OTP-13152
类型
map/0
是内置的,不能被重新定义。自有 ID: OTP-13153
如果给定的原始文件名(二进制文件),让
dets:open_file()
以badarg
消息退出。自有 ID: OTP-13229 辅助 ID: ERL-55
添加
filename:basedir/2,3
basedir 返回适合“user_cache”、“user_config”、“user_data”、“user_log”、“site_config”和“site_data”的路径。在 Linux 和类 Linux 系统上,路径将遵循 XDG 环境变量。
自有 ID: OTP-13392
有新的预处理器指令
-error(Term)
和-warning(Term)
分别用于导致编译错误或编译警告。自有 ID: OTP-13476
通过使用单次遍历来构建新列表同时检查正确性,优化
'++'
运算符和lists:append/2
。自有 ID: OTP-13487
添加
maps:update_with/3,4
和maps:take/2
自有 ID: OTP-13522 辅助 ID: PR-1025
已添加
lists:join/2
。与string:join/2
类似,但适用于任意列表。自有 ID: OTP-13523
混淆断言以使 Dialyzer 停止输出。
自有 ID: OTP-13524 辅助 ID: PR-1002
监督者现在在 sys:get_status/1,2 的返回值中显式添加其回调模块。这是为了简化自定义监督者实现。监督者的 sys:get_status/1,2 返回值的 Misc 部分现在是
[{data, [{"State", State}]},{supervisor,[{"Callback",Module}]}]
* 潜在的不兼容性 *
自有 ID: OTP-13619 辅助 ID: PR-1000
放宽
proc_lib
中初始调用的转换,即删除仅为gen_server
和gen_fsm
执行转换的限制。这使得用户定义的基于gen
的通用回调模块可以在c:i()
和观察器中很好地显示。自有 ID: OTP-13623
函数
queue:lait/1
(liat/1
的拼写错误)现已弃用。自有 ID: OTP-13658
STDLIB 2.8.0.1
改进和新功能
列表减法(
--
运算符)现在将在大型输入上正确产生结果。自有 ID:OTP-15371
STDLIB 2.8
已修复的错误和故障
修复解释器中绑定映射键变量匹配中的求值。
在此修补程序之前,以下代码将不会求值:
X = key,(fun(#{X := value}) -> true end)(#{X => value})
自有 ID: OTP-13218
修复
erl_eval
不使用非本地函数处理程序的问题。自有 ID: OTP-13228 辅助 ID: ERL-32
如果存在
-deprecated()
属性但没有-module()
声明,则 Erlang 代码 Linter 不再崩溃。自有 ID: OTP-13230 辅助 ID: ERL-62
由于 OTP 18.0 中的时间 API 重写,
dets:info(Tab, safe_fixed)
返回的结果中的时间戳被意外破坏。现在已修复此问题。自有 ID: OTP-13239 辅助 ID: OTP-11997
在使用加密抽象格式时,消除了
beam_lib
中罕见的竞争条件。自有 ID: OTP-13278
改进了 maps:with/2 和 maps:without/2 算法
新实现显着加快了所有大小的输入的执行速度。
自有 ID: OTP-13376
改进和新功能
时间扭曲安全改进。
为跟踪、顺序跟踪和系统配置文件功能引入了选项
monotonic_timestamp
和strict_monotonic_timestamp
。这是因为已经存在的timestamp
选项不是时间扭曲安全的。为
ets:info/2
和dets:info/2
引入了选项safe_fixed_monotonic_time
。这是因为已经存在的safe_fixed
选项不是时间扭曲安全的。自有 ID: OTP-13222 辅助 ID: OTP-11997
在 shell 中,Ctrl+W(删除单词)不再将“.”视为单词的一部分。
自有 ID: OTP-13281
STDLIB 2.7
已修复的错误和故障
Erlang 漂亮打印机使用
::
表示函数类型约束。修复了地图对类型中带注释的类型联合元素的漂亮打印方面的错误。
纠正了一些关于类型和规范文档的小问题。
自有 ID: OTP-13084
如果列表的漂亮打印设置为
false
,则 shell 命令rp
将字符串打印为整数列表。自有 ID: OTP-13145
如果给出了具有冲突类型的位语法表达式(例如,如果字段类型被给出为“
integer-binary
”),则 shell 将崩溃。(感谢 Aleksei Magusev 报告此错误。)自有 ID: OTP-13157
即使之前没有创建种子,
rand:export_seed/0
也永远不会返回“undefined
”。已修复为如果进程字典中没有种子,则返回“undefined
”。自有 ID: OTP-13162
改进和新功能
在 Erlang shell 中添加对 Delete、Home 和 End 键的支持。
自有 ID: OTP-13032
beam_lib:all_chunks/1
和beam_lib:build_module/1
已被记录。自有 ID: OTP-13063
STDLIB 2.6
已修复的错误和故障
在 OTP 18.0 中,
qlc
不能很好地处理语法错误。此错误已修复。自有 ID: OTP-12946
优化 zip:unzip/2,以便解压缩到内存。
自有 ID: OTP-12950
STDLIB 参考手册已更新,以显示关于
gen_fsm:reply/2
返回值的正确信息。自有 ID: OTP-12973
re:split2,3 和 re:replace/3,4 现在可以正确处理使用“
unicode
”选项编译的预编译模式。自有 ID: OTP-12977
按文档导出
shell:catch_exception/1
。自有 ID: OTP-12990
改进和新功能
引入了一种机制,用于限制内置错误记录器事件将产生的文本量。它有助于限制日志文件的大小和用于生成它们的 CPU 时间。
此机制是实验性的,因为它可能会在事实证明它不能解决它应该解决的问题时发生更改。在这种情况下,此机制可能会有向后不兼容的改进。
有关如何启用此功能的信息,请参阅 Kernel 应用程序中配置参数
error_logger_format_depth
的文档。自有 ID: OTP-12864
STDLIB 2.5
已修复的错误和故障
修复 filename:join/2 中对单个点的处理
参考手册说 filename:join(A,B) 等效于 filename:join([A,B])。在某些罕见情况下,这被证明不是真的。例如
filename:join("/a/.","b") -> "/a/./b"
vsfilename:join(["/a/.","b"]) -> "/a/b"
。这已被纠正。现在,只有当单个点出现在结果路径的最开头或最末尾时,才会保留该点。
* 潜在的不兼容性 *
自有 ID: OTP-12158
已删除
gen_server
的未文档化选项generic_debug
。自有 ID: OTP-12183
erl_lint:icrt_export/4 已被重写,以使代码真正遵循 Erlang 的作用域规则,而不仅仅是在大多数情况下偶然地遵循。
自有 ID: OTP-12186
为 binary:split/3 添加“trim_all”选项
此选项可以设置为删除对 binary:split/3 的调用结果中_所有_的空部分。
自有 ID:OTP-12301
修正 orddict(3) 中关于
fold()
和map/0
的评估顺序。自有 ID:OTP-12651 辅助 ID:seq12832
修正
maps
模块的错误异常。现在,向 maps 模块函数输入错误将会产生以下异常:
- {badmap, NotMap}, 或
- badarg。
自有 ID:OTP-12657
现在可以在 JCL 模式下粘贴(使用 Ctrl-Y)上一个 shell 会话中复制的文本。还修复了粘贴文本时导致 JCL 模式崩溃的错误。
自有 ID:OTP-12673
添加
uptime()
shell 命令。自有 ID:OTP-12752
在 erl_lint 中缓存 nowarn_bif_clash 函数。
此补丁将 nowarn_bif_clash 存储在 lint 记录中。通过在编译 erlang 解析器时使用 erlc +'{eprof,lint_module}',我们注意到 nowarn_function/2 花费的时间从 30% 减少到 0.01%。
自有 ID:OTP-12754
通过使用缓存的文件名信息来优化 Erlang 代码检查器。
自有 ID:OTP-12772
如果 simple_one_for_one 的子进程从其启动函数返回 ignore,则不再存储该子进程以进行任何重启类型。由于 supervisor 是 simple_one_for_one,因此无法重启或删除该子进程。
自有 ID:OTP-12793
使
ets:file2tab
保留表的已启用read_concurrency
和write_concurrency
选项。自有 ID:OTP-12814
在许多情况下,用户代码需要能够区分正常关闭的套接字和被中止的套接字。设置选项 {show_econnreset, true} 使使用者可以在活动和被动套接字上都接收到 ECONNRESET 错误。
自有 ID:OTP-12841
改进和新特性
允许使用 map 作为 supervisor 标志和子进程规范
以前,supervisor 标志和子进程规范以元组的形式给出。虽然为了向后兼容性保留了这种形式,但现在也允许将这些参数作为 map 给出,请参阅 sup_flags 和 child_spec。
自有 ID:OTP-11043
添加了一个新的系统消息
terminate
。可以使用sys:terminate/2,3
发送此消息。如果接收进程正确处理系统消息,它将在收到此消息后不久终止。新的函数
proc_lib:stop/1,3
利用这个新的系统消息并监视接收进程,以便于为“特殊进程”提供同步停止机制。以下函数使用
proc_lib:stop/1,3
gen_server:stop/1,3
(新)gen_fsm:stop/1,3
(新)gen_event:stop/1,3
(修改为同步)wx_object:stop/1,3
(新)
自有 ID:OTP-11173 辅助 ID:seq12353
删除
pg
模块,该模块已通过 OTP-17 弃用,现在已从 STDLIB 应用程序中删除。该模块被标记为实验性模块超过 15 年,并且在很大程度上已被 Kernel 应用程序中的pg2
模块取代。自有 ID:OTP-11907
新 BIF:
erlang:get_keys/0
,列出与进程字典关联的所有键。注意:erlang:get_keys/0
是自动导入的。* 潜在的不兼容性 *
自有 ID:OTP-12151 辅助 ID:seq12521
在
io_lib
中添加三个新函数 -scan_format/2
,unscan_format/1
和build_text/1
- 它们公开了格式控制序列的已解析形式,从而可以轻松修改或过滤io_lib:format/2
的输入。例如,这可以用于在执行实际格式化之前,将诸如~w
或~p
之类的无界大小控制序列替换为相应的深度限制的~W
和~P
。自有 ID:OTP-12167
引入
erl_anno
模块,它是抽象格式中标记和元组的第二个元素的抽象。自有 ID:OTP-12195
支持在表达式和模式中使用变量作为 Map 的键
Erlang 将接受任何表达式作为 Map 表达式中的键,并且它将接受字面值或绑定的变量作为 Map 模式中的键。
自有 ID:OTP-12218
Mnemosyne Rules 的最后痕迹已被删除。
自有 ID:OTP-12257
在 match_specs 中正确支持 map
自有 ID:OTP-12270
新函数
ets:take/2
。其工作方式与ets:delete/2
相同,但也返回已删除的对象。自有 ID:OTP-12309
string:tokens/2
的速度更快一些,特别是当分隔符列表仅包含一个分隔符字符时。自有 ID:OTP-12422 辅助 ID:seq12774
抽象格式(在 ERTS 用户指南中)的文档已使用类型和规范进行了更新。(感谢 Anthony Ramine。)
已删除抽象格式类型中使用的显式括号表示形式。而是可以使用新函数
erl_parse:type_inop_prec()
和erl_parse:type_preop_prec()
在需要时插入括号。自有 ID:OTP-12492
防止 zip:zip_open/[12] 在父进程死亡时泄漏文件描述符。
自有 ID:OTP-12566
添加了一个新的随机数生成器,请参阅
rand
模块。它具有更好的特性和改进的接口。自有 ID:OTP-12586 辅助 ID:OTP-12501, OTP-12502
当给定一个空二进制时,
filename:split/1
现在将返回一个空列表,使其与给定空列表时的返回值一致。自有 ID:OTP-12716
向
ets:tab2file/3
添加sync
选项。自有 ID:OTP-12737 辅助 ID:seq12805
添加函数
gb_sets:iterator_from()
和gb_trees:iterator_from()
。(感谢 Kirill Kinduk。)自有 ID:OTP-12742
向 maps 模块添加
maps:filter/2
。自有 ID:OTP-12745
更改一些内部数据结构为 Map,以加快编译时间。测量的加速约为 10%-15%。
自有 ID:OTP-12774
更新
orddict
以使用参数化类型和规范。(感谢 UENISHI Kota。)自有 ID:OTP-12785
eunit
中的 assert 宏已移出到stdlib/include/assert.hrl
。该文件由eunit.hrl
包含。因此,eunit 用户没有任何变化,但现在也可以单独包含断言。自有 ID:OTP-12808
STDLIB 2.4
修复的错误和故障
字符类型 \d、\w 和 \s 的行为始终是不匹配值大于 255 的字符,而不是 128,即它们限于 ISO-Latin-1,而不是 ASCII
自有 ID:OTP-12521
改进和新特性
c:m/1 现在显示模块的 MD5 总和。
自有 ID:OTP-12500
使 ets:i/1 处理来自 IO 服务器的二进制输入。
自有 ID:OTP-12550
STDLIB 2.3
修复的错误和故障
string:tokens/2 的文档现在明确指定相邻的分隔符字符在生成的标记列表中不产生任何空字符串。
自有 ID:OTP-12036
修复 ssh 应用程序中已损坏的弃用警告
自有 ID:OTP-12187
Maps:正确对齐文档中的联合类型关联值
自有 ID:OTP-12190
修复 'Cwd' 以点结尾时 filelib:wildcard/2 的问题
自有 ID:OTP-12212
允许在属性内部的 map 值中使用
Name/Arity
语法。自有 ID:OTP-12213
修复 edlin 以正确保存使用 ctrl-u 杀死的文本。在此修复之前,在 Erlang shell 中输入文本,然后使用 ctrl-u 将其杀死,再使用 ctrl-y 将其粘贴回来,会导致粘贴的文本与原始杀死的文本相反。
自有 ID:OTP-12224
如果回调函数以 exit/1 终止,则 gen_server 生成的错误报告中将没有堆栈跟踪。 此问题已得到纠正。
为了保持向后兼容性,进程的实际退出原因没有更改。
自有 ID:OTP-12263 辅助 ID:seq12733
ms_transform
产生的警告可能会指出错误的行号。自有 ID:OTP-12264
改进和新特性
支持在本地计算机上安装的文件系统以外的其他介质上创建 tar 文件。
erl_tar
api 已使用erl_tar:init/3
扩展,该扩展可以使用户提供的媒体存储例程。 一组特定于 ssh 的此类例程隐藏在新的函数ssh_sftp:open_tar/3
中,以简化在远程 ssh 服务器上创建 tar 归档文件的过程。向
erl_tar:add/3,4
添加了分块文件读取选项,以节省例如小型嵌入式系统上的内存。 可以指定在这种情况下从文件中读取的切片的大小。自有 ID:OTP-12180 辅助 ID:seq12715
对于调用进程中的长消息队列,I/O 请求进行了优化。
自有 ID:OTP-12315
STDLIB 2.2
修复的错误和故障
sys:handle_debug/4 的 FormFunc 参数的类型规范错误地指向了 dbg_fun()。现在已更正,新类型为 format_fun()。
自有 ID:OTP-11800
诸如 gen_fsm 和 gen_server 之类的行为应始终在将状态打印到日志之前调用 format_status/2。
自有 ID:OTP-11967
已更正
dets:insert_new/2
的文档。(感谢 Alexei Sholik 报告此错误。)自有 ID:OTP-12024
使用 io_lib:format 和控制序列 w、精度 P 和字段宽度 F 打印一个项,其中 F< P 会以以下两种方式之一失败
如果 P < 项的打印长度,则会进入无限循环,消耗所有可用内存。
如果 P >= 项的打印长度,则会引发异常。
这两个问题现在都已得到纠正。
自有 ID:OTP-12041
已更正
maps:values/1
的文档。自有 ID:OTP-12055
展开 map 表达式中的 shell 函数。
自身 ID: OTP-12063
改进和新特性
添加 maps:with/2
自身 ID: OTP-12137
STDLIB 2.1.1
修复的 Bug 和故障
OTP-11850 修复了 filelib:wildcard/1 以使其能与损坏的符号链接一起工作。然而,此修正引入了问题,因为对于 filelib:ensure_dir/1、filelib:is_dir/1、filelib:file_size/1 等函数,不再跟踪符号链接。现在已对此进行了修正。
自身 ID: OTP-12054 辅助 ID: seq12660
STDLIB 2.1
修复的 Bug 和故障
filelib:wildcard("broken_symlink")
如果 "broken_symlink" 是一个不指向现有文件的符号链接,则会返回一个空列表。自身 ID: OTP-11850 辅助 ID: seq12571
erl_tar
现在可以处理包含 Unicode 字符的文件名。请参阅erl_tar
文档中的“UNICODE SUPPORT”。在创建 tar 文件时,
erl_tar
有时会写入过短的磁带结尾标记。GNU tar 会正确地从这样的 tar 文件中提取文件,但会抱怨“A lone zero block at...”。自身 ID: OTP-11854
当重新定义和导出类型
map/0
时,Erlang 代码检查器 (erl_lint
) 错误地发出了一个错误。这个 bug 已经被修复。自身 ID: OTP-11872
修复了调试器和 erl_eval 中 map 更新的评估
报告者: José Valim
自身 ID: OTP-11922
改进和新特性
以下原生函数现在在 reductions 用完时会增加适当的 reductions 并让步
erlang:binary_to_list/1
erlang:binary_to_list/3
erlang:bitstring_to_list/1
erlang:list_to_binary/1
erlang:iolist_to_binary/1
erlang:list_to_bitstring/1
binary:list_to_bin/1
特性影响
性能 - 从列表转换的函数在非常小的列表时性能有所下降,而在非常大的列表时性能有所提高。
优先级 - 之前,执行这些函数之一的进程实际上获得了不公平的优先级提升。这种优先级提升取决于输入的大小。输入越大,优先级提升就越大。现在这种不公平的优先级提升消失了。
自身 ID: OTP-11888
向 maps 模块添加
maps:get/3
。如果键在 map 中不存在,该函数将返回提供的默认值。自身 ID: OTP-11951
STDLIB 2.0
修复的 Bug 和故障
选项 dupnames 在 re 中没有按预期工作。当查找具有 {capture, [Name, ...]} 的名称时,re:run 返回该名称匹配的随机实例,而不是文档中声明的最左侧匹配实例。现在已更正为符合文档。还添加了选项 {capture,all_names} 以及 re:inspect/2 函数,以进一步帮助使用命名的子模式。
自身 ID: OTP-11205
如果为 standard_input 设置了选项 'binary',那么如果输出超过一页,c:i() 将会挂起 - 即在 "(c)ontinue (q)uit -->" 之后的输入无法读取。这已被纠正。(感谢 José Valim)
自身 ID: OTP-11589
stdlib/lists: 添加函数 droplast/1。此函数删除非空列表的最后一个元素。lists:last/1 和 lists:droplast/1 是 hd/1 和 tl/1 的对偶,但用于列表的末尾。(感谢 Hans Svensson)
自身 ID: OTP-11677
允许一次性禁止所有自动导入。引入 no_auto_import 属性: -compile(no_auto_import)。对于总是使用限定函数名并且想要避免自动导入的函数与本地函数冲突的代码生成工具非常有用。(感谢 José Valim。)
自身 ID: OTP-11682
supervisor_bridge 不再报告子进程的正常终止。原因是,在某些情况下,例如当重启策略为 simple_one_for_one 时,日志可能会被有关正常终止进程的报告完全淹没。(感谢 Artem Ocheredko)
自身 ID: OTP-11685
在 supervisor 模块中,对于使用 {via, Module, Name} 语法的替代注册表的 sup_name() 和 sup_ref() 的类型注释现在与文档一致。Dialyzer 不应再抱怨有效的 supervisor:start_link() 和 supervisor:start_child() 调用。(感谢 Caleb Helbling。)
自身 ID: OTP-11707
两个 Dets 的 bug 已经被修复。当尝试打开一个不是 Dets 文件的短文件时,即使只有读取权限,该文件也会被删除。使用不是 Dets 文件的文件调用
dets:is_dets_file/1
,文件描述符会保持打开状态。(感谢 Håkan Mattsson 报告了这些 bug。)自身 ID: OTP-11709
修复了
ets:all
中的竞争 bug。并发创建表可能导致其他表不包含在结果中。(感谢 Florian Schintke 的 bug 报告)自身 ID: OTP-11726
erl_eval 现在在 guard 中使用 '=='/2 时会正确地评估。(感谢 José Valim)
自身 ID: OTP-11747
在 io_lib_pretty 中,对 proplists:get_value/3 的调用被更快的 lists:keyfind/3 替换。列表中的元素始终是 2 元组。(感谢 Andrew Thompson)
自身 ID: OTP-11752
修复了一个 qlc bug,其中过滤器被错误地优化掉了。感谢 Sam Bobroff 报告了这个 bug。
自身 ID: OTP-11758
Ulf Norell 报告了许多编译器错误,其中不寻常或无意义的代码会导致编译器崩溃,Anthony Ramine 对此进行了纠正。
自身 ID: OTP-11770
自 Erlang/OTP R16B 以来,当重新定义内置类型时,Erlang Core Linter (
erl_lint
) 没有发出错误。这个 bug 已经被修复。(感谢 Roberto Aloi。)自身 ID: OTP-11772
函数
sys:get_state/1,2
和sys:replace_state/2,3
已被修复,因此它们现在可以在进程被 sys 挂起时运行。为了实现这一点,添加了新的回调Mod:system_get_state/1
和Mod:system_replace_state/2
,这些回调也由通用行为gen_server
、gen_event
和gen_fsm
实现。潜在的不兼容性指的是
- 不再支持拦截系统消息并将大小为 2 的元组作为最后一个参数传递给
sys:handle_system_msg/6
的先前行为。 - 当
sys:replace_state/2,3
中的StateFun
失败时的错误处理从完全静默更改为可能会在客户端进程中抛出异常(如果回调模块没有捕获)。
(感谢 James Fish 和 Steve Vinoski)
* 潜在的不兼容性 *
自身 ID: OTP-11817
- 不再支持拦截系统消息并将大小为 2 的元组作为最后一个参数传递给
改进和新特性
向 re:run 添加了设置 match_limit 和 match_limit_recursion 的选项。还添加了选项 report_errors,以便在 re:run 由于限制或编译错误而失败时获得更多信息。
自身 ID: OTP-10285
预定义类型
array/0
、dict/0
、digraph/0
、gb_set/0
、gb_tree/0
、queue/0
、set/0
和tid/0
已被弃用。它们将在 Erlang/OTP 18.0 中移除。相反,可以使用
array:array/0
、dict:dict/0
、digraph:graph/0
、gb_set:set/0
、gb_tree:tree/0
、queue:queue/0
、sets:set/0
和ets:tid/0
。(注意: 一直都需要使用ets:tid/0
。)在 Erlang/OTP 17.0 中允许本地重新定义类型
array/0
、dict/0
等。添加了新类型
array:array/1
、dict:dict/2
、gb_sets:set/1
、gb_trees:tree/2
、queue:queue/1
和sets:set/1
。引入了一个编译器选项
nowarn_deprecated_type
。通过包含属性-compile(nowarn_deprecated_type).
在 Erlang 源文件中,可以避免在 Erlang/OTP 17.0 中出现有关已弃用类型的警告。
该选项也可以作为编译器标志给出
erlc +nowarn_deprecated_type file.erl
自身 ID: OTP-10342
更新了带有 'spawn' 的 erlang:open_port/2 调用,以处理命令路径中的空格。
自身 ID: OTP-10842
Dialyzer 的
unmatched_return
警告已得到纠正。自身 ID: OTP-10908
禁止二进制生成器模式中的无大小字段,并简化 v3_core 对位字符串生成器的转换。(感谢 Anthony Ramine。)
自身 ID: OTP-11186
Erlang 的 re 模块使用的 PCRE 库的版本从 7.6 升级到 8.33。这意味着,除其他外,更好的 Unicode 和 Unicode 字符属性支持。还向 re 模块添加了与 PCRE 8.33 连接的新选项(ucd、notempty_atstart、no_start_optimize)。PCRE 在 7.6 和 8.33 之间扩展了正则表达式语法,这就是为什么这会带来潜在的不兼容性。只有非常复杂的正则表达式可能会受到影响,但是如果您知道自己正在使用晦涩的功能,请测试运行您的正则表达式并验证其行为是否没有改变。
* 潜在的不兼容性 *
自身 ID: OTP-11204
添加了 dict:is_empty/1 和 orddict:is_empty/1。(感谢 Magnus Henoch。)
自身 ID: OTP-11353
调用
garbage_collect/1
BIF 或check_process_code/2
BIF 可能会触发对调用 BIF 的进程以外的其他进程的垃圾回收。先前的实现执行这些类型的垃圾回收时没有考虑正在进行垃圾回收的进程的内部状态。为了能够更容易和更有效地实现让步原生代码,已经重写了这些类型的垃圾回收。像这样的垃圾回收现在由异步请求信号触发,实际的垃圾回收由正在进行垃圾回收的进程本身执行,并通过对发出请求的进程的回复信号完成。使用这种方法,进程可以禁用垃圾回收并让步,而无需将堆设置为可以进行垃圾回收的状态。引入了
garbage_collect/2
和check_process_code/3
BIF。这两个 BIF 都将选项列表作为最后一个参数。使用它们可以发出异步请求。code:purge/1
和code:soft_purge/1
已被重写,以利用异步check_process_code
请求来并行化工作。特性影响:调用
garbage_collect/1
BIF 或check_process_code/2
BIF 通常需要更长的时间才能完成,但系统整体不会像以前那样受到操作的负面影响。调用code:purge/1
和code:soft_purge/1
的完成速度可能更快或更慢,具体取决于系统的状态,但系统整体不会像以前那样受到操作的负面影响。自身 ID:OTP-11388 辅助 ID:OTP-11535,OTP-11648
改进了 supervisor 的
via
引用的文档。(感谢 MaximMinin。)自身 ID:OTP-11399
orddict:from_list/1
现在使用lists
模块中优化的排序例程,而不是(本质上)插入排序。根据输入数据,新的from_list/1
的速度比旧的from_list/1
快,从略微快到快几个数量级不等。(感谢 Steve Vinoski。)
自身 ID:OTP-11552
EEP43:新的数据类型 - Maps(映射)
使用 Maps,您可以例如
____ -
M0 = #{ a => 1, b => 2}, % 创建关联
____ -
M1 = M0#{ a := 10 }, % 更新值
____ -
M2 = M1#{ "hi" => "hello"}, % 添加新关联
____ -
#{ "hi" := V1, a := V2, b := V3} = M2. % 将键与值匹配
有关如何使用 Maps 的信息,请参阅 参考手册中的“Map Expressions”(映射表达式)。
当前的实现不包含以下功能
____ - 没有可变键
____ - 没有单值访问
____ - 没有映射推导
请注意,在 OTP 17.0 期间,Maps 是实验性的。
自身 ID:OTP-11616
现在,当在 Erlang shell 中进行制表符补全时,除非存在另一个具有相同名称和不同元数的函数,否则它会将零元函数一直扩展到右括号。(感谢 Pierre Fenoll。)
自身 ID:OTP-11684
Erlang 代码预处理器 (
epp
) 在包含的文件中遇到循环宏定义时可能会循环。此错误已修复。感谢 Maruthavanan Subbarayan 报告此错误,并感谢 Richard Carlsson 提供错误修复。
自身 ID:OTP-11728
自 Erlang/OTP R13B 以来,Erlang 代码检查器 (
erl_lint
) 在重新定义任何arity/0
、bitstring/0
、iodata/0
或boolean/0
类型时会发出警告。现在改为发出错误。* 潜在的不兼容性 *
自身 ID:OTP-11771
erl_parse:abstract/2
的encoding
选项已扩展为包含none
和一个回调函数(谓词)。自身 ID:OTP-11807
导出 zip 选项类型,允许从其他模块引用。
感谢 Pierre Fenoll 和 Håkan Mattson
自身 ID:OTP-11828
模块
pg
已被弃用,将在 Erlang/OTP 18 中删除。自身 ID:OTP-11840
STDLIB 1.19.4
修复的 Bug 和故障
修复 gen_server.erl 中的拼写错误。感谢 Brian L. Troutwine。
自身 ID:OTP-11398
atan2 的规范应为 atan2(Y, X),而不是 atan2(X, Y)。感谢 Ary Borenszweig。
自身 ID:OTP-11465
改进和新特性
为正则表达式语法添加 XML 标记。感谢 Håkan Mattson。
自身 ID:OTP-11442
STDLIB 1.19.3
修复的 Bug 和故障
函数
dets:foldl/3
、dets:foldr/3
和dets:traverse/2
在遍历到表尾后没有释放表。该 Bug 是在 R16B 中引入的。(感谢 Manuel Duran Aguete。)自身 ID:OTP-11245
如果错误地使用了
fun M:F/A
构造,则检查器可能会崩溃。(感谢 Mikhail Sobolev。)自身 ID:OTP-11254
已更正
io_lib:fread/2,3
的规范。(感谢 Chris King 和 Kostis Sagonas 指出此错误。)自身 ID:OTP-11261
改进和新特性
修复 gen_server 中的类型拼写错误。
自身 ID:OTP-11200
更新 filelib 和 io_prompt 中的类型规范。感谢 Jose Valim。
自身 ID:OTP-11208
修复 abcast() 函数注释中的拼写错误。感谢 Johannes Weissl。
自身 ID:OTP-11219
使 edlin 能够理解一些重要的控制键。感谢 Stefan Zegenhagen。
自身 ID:OTP-11251
从 digraph 模块导出 edge/0 类型。感谢 Alex Ronne Petersen。
自身 ID:OTP-11266
修复 erl_lint 中的变量使用情况跟踪,并修复 try 表达式中不安全的变量跟踪。感谢 Anthony Ramine。
自身 ID:OTP-11268
STDLIB 1.19.2
修复的 Bug 和故障
Erlang 扫描器不再接受输入字符串中的浮点数。
自身 ID:OTP-10990
当使用 unicode:characters_to_list 将错误的二进制文件转换为列表时,错误返回值可能包含错误的“rest”,即无法转换的字符 io_list 是错误的。这种情况仅在输入为子二进制文件且转换来自 utf8 时发生。现在已更正。
自身 ID:OTP-11080
在 Erlang Pretty Printer
erl_pp
中,类型hook_function()
已被更正。还修复了无效形式(例如记录字段类型)的打印。自 R16B 以来,它一直损坏。
(感谢 Tomáš Janoušek。)
自身 ID:OTP-11100
修复 erl_eval 中对 BEAM 模块的接收支持。感谢 Anthony Ramine。
自身 ID:OTP-11137
改进和新特性
删除有关简单一对一 supervisor 的过时说明。感谢 Magnus Henoch。
自身 ID:OTP-10938
在选择以 Erlang 编写的脚本 (
escript
) 的编码时,现在可以识别第二行的可选指令。自身 ID:OTP-10951
已记录函数
erl_parse:abstract/2
。自身 ID:OTP-10992
整合 Andreas Schultz 的椭圆曲线贡献
为了能够在 SSL/TLS 中支持椭圆曲线密码套件,已向 public_key 和 crypto 添加了处理椭圆曲线基础设施的功能。
这也导致了 crypto API 的重写,以获得一致性并消除不必要的开销。所有使用 crypto 的 OTP 应用程序都已更新为使用新的 API。
影响:椭圆曲线密码术 (ECC) 使用比其他公钥算法更小的密钥大小提供同等的安全性。更小的密钥大小可以节省功耗、内存、带宽和计算成本,这使得 ECC 对受限环境特别有吸引力。
自身 ID:OTP-11009
添加了 sys:get_state/1,2 和 sys:replace_state/2,3。感谢 Steve Vinoski。
自身 ID:OTP-11013
对 gen 机制的优化。感谢 Loïc Hoguin。
自身 ID:OTP-11025
对 gen.erl 的优化。感谢 Loïc Hoguin。
自身 ID:OTP-11035
在适用的情况下使用 erlang:demonitor(Ref, [flush])。感谢 Loïc Hoguin。
自身 ID:OTP-11039
现在,具有非 ASCII 字符的 Erlang 源文件以 UTF-8 编码(而不是 latin1)。
自身 ID:OTP-11041 辅助 ID:OTP-10907
修复了 rest_for_one 和 one_for_all 重启未终止的子进程的问题。感谢 James Fish。
自身 ID:OTP-11042
修复 timer_server 的过度 CPU 消耗。感谢 Aliaksey Kandratsenka。
自身 ID:OTP-11053
将 lists:zf/2 重命名并记录为 lists:filtermap/2。感谢 Anthony Ramine。
自身 ID:OTP-11078
修复了 epp 中的不一致状态。感谢 Anthony Ramine
自身 ID:OTP-11079
c:ls(File) 现在将打印 File,类似于 Unix 中的 ls(1)。错误消息也得到了改进。(感谢 Bengt Kleberg。)
自身 ID:OTP-11108
支持 erl_pp 中的回调属性。感谢 Anthony Ramine。
自身 ID:OTP-11140
提高 erl_lint 性能。感谢 José Valim。
自身 ID:OTP-11143
STDLIB 1.19.1
修复的 Bug 和故障
在
erl_eval
模块中修复了与 Unicode 相关的 Bug。自身 ID:OTP-10622 辅助 ID:kunagi-351 [262]
filelib:wildcard("some/relative/path/*.beam", Path)
将无法匹配任何文件。也就是说,如果模式的第一个组件不包含任何通配符,则 filelib:wildcard/2 将不起作用。(之前在 R15B02 中尝试修复此问题似乎使情况更糟。)(感谢 Samuel Rivas 和 Tuncer Ayaz。)
对
Path
参数也有一个不兼容的更改。它不再允许是二进制文件。* 潜在的不兼容性 *
自身 ID:OTP-10812
改进和新特性
新的 STDLIB 应用程序变量
shell_strings
可用于确定 Erlang shell 如何输出整数列表。新函数shell:strings/1
将切换变量的值。控制序列修饰符
l
可用于关闭~p
和~P
的字符串识别。自身 ID:OTP-10755
由于 Unicode 支持而进行的杂项更新。
自身 ID:OTP-10820
扩展
~ts
以处理使用 ISO-latin-1 编码字符的二进制文件自身 ID:OTP-10836
erl 的 +pc 标志可用于设置被视为可打印的字符范围。这会影响 shell 和 io:format("~tp",...) 功能如何进行启发式字符串检测。有关详细信息,请参阅 STDLIB 用户指南。
自身 ID:OTP-10884
STDLIB 1.19
修复的错误和故障
传递给
filelib:wildcard/2
的通配符(如“some/path/*”)将无法匹配任何文件。(感谢 Samuel Rivas 报告此错误。)自有 ID:OTP-6874 辅助 ID:kunagi-190 [101]
修复了 proc_lib:start 中的错误处理,如果产生的进程在初始化时死掉,可能会导致挂起。
自有 ID:OTP-9803 辅助 ID:kunagi-209 [120]
允许在 filelib:wildcard 中使用 **
两个相邻的 * 用作单个模式将匹配所有文件以及零个或多个目录和子目录。(感谢 José Valim)
自有 ID:OTP-10431
在 re:replace/3,4 中为反向引用添加 \gN 和 \g{N} 语法,以允许与数字替换字符串一起使用。(感谢 Vance Shipley)
自有 ID:OTP-10455
导出 ets:match_pattern/0 类型(感谢 Joseph Wayne Norton)
自有 ID:OTP-10472
修复了使用 ~W 在深度 1 处打印空二进制文件的问题(感谢 Andrew Thompson)
自有 ID:OTP-10504
base64
模块中的类型ascii_string()
已更正。类型file:file_info()
已清理。类型file:fd()
在文档中已被设置为不透明。自有 ID:OTP-10624 辅助 ID:kunagi-352 [263]
改进和新功能
使用绑定键遍历时,Dets 表不再被固定(当只匹配具有正确键的对象时)。此优化会影响函数
match/2
、match_object/2
、select/2
、match_delete/2
和select_delete/2
。自有 ID:OTP-10097
已实现 Unicode 支持。
自有 ID:OTP-10302
linter 现在会警告未导出的不透明类型,以及欠规范的不透明类型。
自有 ID:OTP-10436
在
filename
模块中的以下函数中,类型file:name()
已替换为类型file:filename()
:absname/2
、absname_join/2
、join/1,2
和split/1
。自有 ID:OTP-10474
如果子进程在其启动函数中失败,则错误原因之前只会作为来自 error_handler 的错误报告报告,并且 supervisor:start_link 只会返回
{error,shutdown}
。这已更改,因此 supervisor 现在将返回{error,{shutdown,Reason}}
,其中Reason
标识失败的子项及其错误原因。(感谢 Tomas Pihl)* 潜在的不兼容性 *
自有 ID:OTP-10490
在必要时,已将说明编码的注释添加到 Erlang 文件中。该注释旨在在 UTF-8 成为默认编码时在 Erlang/OTP R17B 中删除。
自有 ID:OTP-10630
已更正和改进模块
erl_scan
和sys
的约定和类型。(感谢 Kostis Sagonas。)自有 ID:OTP-10658
Erlang shell 现在会在遇到 Erlang 扫描器错误时跳过该行的其余部分。
自有 ID:OTP-10659
清理 proplists 模块中的一些规范。(感谢 Kostis Sagonas。)
自有 ID:OTP-10663
已更正一些溢出 PDF 页面宽度的示例。
自有 ID:OTP-10665
允许 escript 在脚本文件没有 shebang 时接受仿真器参数。感谢 Magnus Henoch
自有 ID:OTP-10691
修复 queue:out/1, queue:out_r/1 中最坏情况下 O(N^2) 的错误。感谢 Aleksandr Erofeev。
自有 ID:OTP-10722
epp
模块中有新函数可以从文件中读取字符编码。有关更多信息,请参阅epp
。自有 ID:OTP-10742 辅助 ID:OTP-10302
已为 Unicode 调整
io_lib
中的函数。现有函数write_string()
等现在接受 Unicode 字符串,而旧行为已由新函数write_latin1_string()
等接管。还有一些新函数可以将 Unicode 字符串写为 Latin-1 字符串,主要针对 Erlang 漂亮打印机 (erl_pp
)。自有 ID:OTP-10745 辅助 ID:OTP-10302
新函数
proc_lib:format/2
和erl_parse:abstract/2
接受编码作为第二个参数。自有 ID:OTP-10749 辅助 ID:OTP-10302
增加了 ETS 中
write_concurrency
选项的潜在并发性。内部表锁的数量已从 16 增加到 64。这使得两个并发进程写入同一表而发生冲突并因此被序列化的可能性降低了四倍。代价是使用 write_concurrency 的表增加了恒定的内存占用。每个插入记录的内存消耗不受影响。如果write_concurrency
与read_concurrency
结合使用,则增加的占用空间可能会特别大。自有 ID:OTP-10787
STDLIB 1.18.3
修复的错误和故障
次要测试更新
自有 ID:OTP-10591
STDLIB 1.18.2
修复的错误和故障
修复了如果在 Windows 上给定无效的驱动器盘符,则 ensure dir 会进入无限循环的错误。
自有 ID:OTP-10104
对 ServerName 具有全局范围且未给定超时的 gen_server:enter_loop/4 的调用现在可以正常工作。
感谢 Sam Bobroff 报告此问题。
自有 ID:OTP-10130
修复 escript/主存档重新加载
如果在添加到代码路径后 escript/主存档文件的修改时间发生更改,则正确重新加载存档并更新缓存。(感谢 Tuncer Ayaz)
自有 ID:OTP-10151
修复了在某些情况下可能导致带有
compressed
选项的 ETS 表中二进制文件损坏的错误。自有 ID:OTP-10182
修复 Win32 上的 filename:nativename/1
不要在 Win32 上扼杀作为二进制参数给定的路径。感谢 Jan Klötzke
自有 ID:OTP-10188
修复了在 match spec 中使用
'$_'
时可能导致仿真器崩溃的ets:test_ms/2
中的错误。自有 ID:OTP-10190
修复 zip 存档错误地将第一个磁盘号设置为 1 的错误
自有 ID:OTP-10223
改进和新功能
已更正 Erlang shell 作为
badarith
错误的解释打印的消息。(感谢 Matthias Lang。)自有 ID:OTP-10054
STDLIB 1.18.1
修复的错误和故障
已从文档和代码中删除对
is_constant/1
(已在 R12 版本中删除)的引用。自有 ID:OTP-6454 辅助 ID:seq10407
在 supervisor 的重启循环期间将控制权返回给 gen_server
当尝试重启子项失败时,supervisor 之前会保持执行流程并反复尝试重启子项,直到成功或达到重启频率限制。如果这些都没有发生,supervisor 将永远挂起在此循环中。
此提交添加了一个 0 毫秒的计时器,在该计时器中,控制权返回给实现 supervisor 的 gen_server。这样,将处理对 supervisor 的任何传入请求 - 这可能有助于打破无限循环 - 例如 supervisor 或有问题的子项的关闭请求。
由于 supervisor 的新返回值,这会在 stdlib 中引入一些不兼容性
- restart_child/2 现在可以返回 {error,restarting}
- delete_child/2 现在可以返回 {error,restarting}
- which_children/1 返回一个 {Id,Child,Type,Mods} 列表,其中 Child 除了旧的 pid() 或 'undefined' 之外,现在还可以是 'restarting'。
* 潜在的不兼容性 *
自有 ID:OTP-9549
如果临时子项的启动函数返回 'ignore',则 supervisor 将保留其子项规范。这已得到纠正。永远不应保留不存在的临时子项的子项规范。
自有 ID:OTP-9782 辅助 ID:seq11964
在错误记录器中使用通用时间作为基准
之前的转换使用了已弃用的 calendar:local_time_to_universal_time/1
自有 ID:OTP-9854
如果在 guard 中从顶层调用 guard 测试(例如 is_list/1),如果存在具有相同名称的局部定义,则会导致编译器崩溃。已更正为拒绝该程序并显示错误消息。
自有 ID:OTP-9866
修复了 binary:part/3 文档中的类型规范(感谢 Ricardo Catalinas Jiménez)
自有 ID:OTP-9920
更正了 registered 的拼写(感谢 Richard Carlsson)
自有 ID:OTP-9925
将 gb_trees 文档按字母顺序排列(感谢 Aidan Hobson Sayers)
自有 ID:OTP-9929
修复了 ETS 中带有
compressed
选项并在 64 位机器上插入包含大整数(>2G)的项的错误。已被发现会导致仿真器崩溃。(感谢 Diego Llarrull 提供出色的错误报告)自有 ID:OTP-9932
为备用名称查找添加插件支持此补丁引入了一种定位行为实例的新方法:{via, Module, Name}。(感谢 Ulf Wiger)
自有 ID:OTP-9945
函数
digraph_utils:condensation/1
过去常常创建一个包含循环的 digraph,这与文档相矛盾,文档指出创建的 digraph 没有循环。此错误已修复。(感谢 Kostis Sagonas 发现此错误。)自有 ID:OTP-9953
当 escript 结束时,现在所有输出到标准输出和标准错误的内容都会显示在终端上。通过更改 erlang:halt/0,1 的行为,此错误已得到纠正,这应该可以修复其他类似 escript 的应用程序的相同问题,即当在 TTY 上打印并通过 erlang:halt/0,1 退出时,存储在输出端口驱动程序缓冲区中的数据会丢失。
BIF:s erlang:halt/0,1 的语义已得到改进,并且有一个新的 BIF erlang:halt/2 来完成类似于旧语义的操作。请参阅文档。
现在,erlang:halt/0 和带有整数参数的 erlang:halt/1 将关闭所有端口,并允许所有挂起的异步线程操作在退出仿真器之前完成。以前,erlang:halt/0 和 erlang:halt(0) 只会等待挂起的异步线程操作,但不会关闭端口。而带有非零整数参数的 erlang:halt/1 甚至不会等待挂起的异步线程操作。
为了大致恢复旧的行为,当您退出仿真器时,不要等待端口和异步线程操作,您可以使用 erlang:halt/2,其中第一个参数是整数,第二个参数是包含 {flush,false} 的选项列表。请注意,现在刷新并不依赖于退出代码,并且您不能只刷新异步线程操作,我们认为这是一种奇怪的行为。
此外,erlang:halt/1,2 获得了一个新功能:如果第一个参数是原子 'abort',则仿真器将中止,如果操作系统允许,则会生成核心转储。
自有 ID:OTP-9985
添加 escript win32 备用调用。现在可以将 escript 作为 “escript.exe” 和 “escript” 启动(感谢 Pierre Rouleau)
自有 ID:OTP-9997
STDLIB 1.18
已修复的 Bug 和故障
改进了
random
模块中的算法。避免使用可以被质数整除的种子值,从而防止获得卡在零上的子种子。最坏的情况是 random:seed(0,0,0) 产生一系列零。这是一个不兼容的更改,因为依赖于为给定种子重现特定序列的应用程序将会失败。伪随机输出仍然是确定性的,但与早期版本不同。* 潜在的不兼容性 *
自有 ID:OTP-8713
对
global:whereis_name/1
的调用已替换为对global:safe_whereis_name/1
的调用,因为后者根本不安全。之前没有这样做的原因是,设置全局锁掩盖了一个关于受监督子进程重启的 bug。这个 bug 现在已经通过修改
global:whereis_name/1
来修复。(感谢 Ulf Wiger 的代码贡献。)gen_fsm:start*
中一个小的竞争条件已被修复:如果其中一个函数返回{error, Reason}
或 ignore,则该名称仍然可以被注册(本地或在global
中)。(这与在 OTP-7669 中为 gen_server 所做的修改相同。)未公开的函数
global:safe_whereis_name/1
已被删除。自有 ID:OTP-9212 辅助 ID:seq7117,OTP-4174
如果一个监督者的子进程因 {shutdown,Term} 的原因终止,现在监督者会像原因 'shutdown' 一样处理它。
对于重启类型为 'permanent' 的子进程,这意味着没有变化。对于重启类型为 'transient' 的子进程,子进程将不再重启,也不会写入监督者报告。对于重启类型为 'temporary' 的子进程,不会写入监督者报告。
* 潜在的不兼容性 *
自有 ID:OTP-9222
稍微改进了关于临时和瞬态子进程的监督者重启策略的文档。
自有 ID:OTP-9381
具有足够大桶的 Dets 表格并非总是可以修复。此错误已修复。
Dets 文件的格式已修改。降级时,使用新系统创建的表格将被修复。否则,此修改应该不会被注意到。
自有 ID:OTP-9607
已更正
lists
模块中的一些合约。自有 ID:OTP-9616
在 stdlib 的行为中添加 '-callback' 属性
使用所有回调的 -callback' 属性替换 stdlib 行为中的 behaviour_info(callbacks) 导出。更新文档,其中包含有关回调属性的信息,从 '-callback' 属性自动生成 'behaviour_info' 函数
'behaviour_info(callbacks)' 是在描述行为的模块中定义的特殊函数,它返回其回调的列表。
现在使用 '-callback' 规范自动生成此函数。如果用户同时定义了 '-callback' 属性和 behaviour_info/1 函数,则 lint 将返回一个错误。如果回调不需要类型信息,请为其使用通用规范。向语言语法添加 '-callback' 属性
行为可以使用熟悉的 spec 语法为其回调定义规范,用 '-callback' 关键字替换 '-spec'。执行简单的 lint 检查,以确保没有重复定义的回调,并且所有引用的类型都已声明。
然后,工具可以使用这些属性来为行为提供文档或查找回调模块中回调定义中的差异。
将回调规范添加到 kernel 中的“application”模块,根据互联网文档将回调规范添加到 tftp 模块,根据可能已弃用的注释将回调规范添加到 inets_service 模块
自有 ID:OTP-9621
如果 Dets 表格已正确关闭,但空间管理数据无法读取,则无法修复该文件。此错误已修复。
自有 ID:OTP-9622
Unicode 非字符代码点 16#FFFE 和 16#FFFF 不允许使用
unicode
模块或位语法进行编码或解码。这与其他可以编码/解码的非字符 16#FDD0 到 16#FDEF 不一致。为了解决这种不一致,现在可以编码和解码 16#FFFE 和 16#FFFF。(感谢 Alisdair Sullivan。)* 潜在的不兼容性 *
自有 ID:OTP-9624
当包含另一个文件时,使 epp 首先搜索当前文件的目录。这完成了 R11 中仅对 include_lib() 起作用的部分修复。(感谢 Richard Carlsson)
自有 ID:OTP-9645
ms_transform:修复不正确的“变量被遮蔽”警告
此补丁删除了从一个函数子句到另一个函数子句的不正确的变量绑定传递。(感谢 Haitao Li)
自有 ID:OTP-9646
显式终止监督者中的动态子进程
根据监督者的文档:“关于 simple-one-for-one 监督者的重要说明:simple-one-for-one 监督者的动态创建的子进程不会被显式终止,无论关闭策略如何,但预计会在监督者终止时终止(即,当收到来自父进程的退出信号时)。”
只要我们手动停止 simple_one_for_one 监督者,一切都很好。动态子进程会捕获来自监督者的退出信号并离开。但是,如果这种情况发生在我们停止应用程序时,在顶级监督者停止后,应用程序主进程会终止与此应用程序关联的所有剩余进程。因此,在清理期间(这里我们指的是 terminate/2 内部),可能会终止捕获退出信号的动态子进程。这是不可预测的,并且高度依赖于时间。
在此提交中,修补了监督者模块,以根据关闭策略显式终止动态子进程。
注意:停止动态子进程的顺序未定义。实际上,这“几乎”是同时完成的。
停止动态子进程时出现堆栈错误
由于 simple_one_for_one 监督者可以有许多工作进程,我们在其关闭期间堆叠错误,以便仅报告每个遇到的错误类型的一条消息。我们不报告子进程的 pid,而是使用相关子进程的数量。(感谢 Christopher Faulet)
自有 ID:OTP-9647
允许无限超时以关闭工作进程
现在,在子进程规范中,工作进程的关闭值也可以设置为 infinity。删除此限制是因为并非总是可以预测工作进程的关闭时间。这高度依赖于应用程序。向文档中添加关于工作进程关闭策略的警告(感谢 Christopher Faulet)
自有 ID:OTP-9648
在打印错误报告且子进程 pid 未定义时,有时会在监督者中出现 badarg。此问题已得到纠正。
自有 ID:OTP-9669
修复 re:split 规范,使其不接受选项 'global'(感谢 Shunichi Shinohara)
自有 ID:OTP-9691
改进和新功能
修复了一些在 HiPE 平台上经常失败的测试。
自有 ID:OTP-9637
现在,如 Richard O'Keefe 在 EEP-23 中所建议的那样,允许在 '
fun M:F/A
' 中使用变量。'
fun M:F/A
' 在抽象格式中的表示已以不兼容的方式更改。直接读取或操作抽象格式的工具(例如解析转换)可能需要更新。编译器可以处理新旧格式(即,从 pre-R15 BEAM 文件中提取抽象格式并使用 compile:forms/1,2 进行编译将起作用)。syntax_tools
应用程序也可以处理这两种格式。* 潜在的不兼容性 *
自有 ID:OTP-9643
元组函数(具有模块名称和函数的二元素元组)现在已正式弃用,将在 R16 中删除。请改用 '
fun M:F/A
'。为了让您意识到您的系统正在使用元组函数,第一次应用元组函数时,会将警告发送到错误日志记录器。自有 ID:OTP-9649
已删除已弃用的 '
regexp
' 模块。请改用 're
' 模块。* 潜在的不兼容性 *
自有 ID:OTP-9737
filename:find_src/1,2
现在可以处理剥离的 BEAM 文件(由 Per Hedeland 报告)。HiPE 编译器也可以处理剥离的 BEAM 文件。BEAM 编译器将不再在M:module_info(compile)
中包含源代码本身中给出的编译选项(因为如果重新编译模块,无论如何都会应用这些选项)。自有 ID:OTP-9752
STDLIB 1.17.5
已修复的 Bug 和故障
当在用户没有读取访问权限的某个父目录的目录中执行时,erl_tar:extract 失败。此问题已得到纠正。
自有 ID:OTP-9368
已修复
erl_scan:set_attribute/3
中的一个错误。自有 ID:OTP-9412
已更正
io_lib:fread()
的合约。自有 ID:OTP-9413 辅助 ID:seq11873
在尝试匹配文字字符时遇到输入数据结束时,io_lib:fread/2 中发生崩溃,该函数应该返回 {more,_,_,_} 但实际上崩溃了,此问题已得到纠正。由 Klas Johansson 报告。
在任何字段数据之前遇到文件末尾时,io:fread 的类似特殊性也已得到纠正。
自有 ID:OTP-9439
已更正
timer:now_diff()
的合约。(感谢 Alex Morarash)。自有 ID:OTP-9450
修复 gen_fsm 文档中的小拼写错误(感谢 Haitao Li)
自有 ID:OTP-9456
已更正
zip:zip_list_dir/1
和zip:zip_get/2
的合约。自有 ID:OTP-9471 辅助 ID:seq11887,OTP-9472
已修复
zip:zip_open()
中的一个错误。自有 ID:OTP-9472 辅助 ID:seq11887,OTP-9471
修复微不足道的文档错误(感谢 Matthias Lang)
自有 ID:OTP-9498
添加 proplist() 类型
最近我向 API 添加规范时,发现没有定义规范的 proplist() 类型。(感谢 Ryan Zezeski)
自有 ID:OTP-9499
修复监督者重启临时子进程的问题
在监督者的当前实现中,永远不应重启临时子进程。但是,当作为 one_for_all 或 rest_for_one 策略的一部分重启临时子进程时,其中失败的进程不是临时子进程,监督者仍然会尝试重启它。
由于监督者不保留临时子进程的某些 MFA 信息,这会导致监督者达到其重启限制并崩溃。
此补丁通过在 terminate_children/2-3 (私有函数)中插入一个子句来修复此行为,该子句将在构建已终止进程列表时省略临时子进程,以避免 supervisor 尝试再次重启它们。
只有需要重启子进程的 supervisor 才会使用该列表,因此此更改对于仅调用 terminate_children/2-3 来终止所有子进程的函数应该没有影响。
文档已修改,以更明确地说明此行为。(感谢 Fred Hebert)
内部 ID:OTP-9502
修复损坏的 edoc 注解(感谢 Richard Carlsson)
内部 ID:OTP-9516
XML 文件已更正。
内部 ID:OTP-9550 辅助 ID:OTP-9541
处理加密密钥服务器功能中罕见的竞争情况
内部 ID:OTP-9586
改进和新功能
已添加类型和规范。
内部 ID:OTP-9356
已修改
queue
模块的契约。内部 ID:OTP-9418
STDLIB 和 Kernel 中的契约已得到改进,并且已更正类型错误。
内部 ID:OTP-9485
多个 BIF 的类型已扩展/更正。此外,
lists:keyfind/3
、lists:keysearch/3
和lists:keyemember/3
的类型也已更正。不正确/不完整的类型可能会导致错误的 Dialyzer 警告。内部 ID:OTP-9496
STDLIB 1.17.4
已修复的错误和故障
默认值
undefined
以这样一种方式添加到记录字段类型中,即结果并非总是格式良好的类型。此错误已修复。内部 ID:OTP-9147
原子更新索引文件
由于 log_mf_h 索引文件可能会被错误处理程序以外的其他进程读取(例如,被 rb 工具读取),因此应原子更新此文件。这将避免在以写入模式打开文件(从而清空文件)和实际使用新内容更新文件之间的时间间隔。为此,会写入一个临时文件,并使用 file:rename/1 来替换实际的索引文件。
内部 ID:OTP-9148
修复了文档中的各种拼写错误(感谢 Tuncer Ayaz)
内部 ID:OTP-9154
当临时进程终止时不应保存其子进程规范,因为它们不应该被重启。保存临时子进程规范将导致您无法使用与已终止的临时进程相同的子进程规范启动新的临时进程。自从 R14B02 以来,您无法重启临时临时进程,因为不再保存参数,但是,重启临时进程在语义上一直是不正确的。感谢 Filipe David Manana 报告此问题并提出解决方案。
内部 ID:OTP-9167 辅助 ID:OTP-9064
各种小的文档修复(感谢 Bernard Duggan)
内部 ID:OTP-9172
修复未注册的 gen_event 进程的 format_status 错误
将 gen_fsm 代码移植到 gen_event 的 format_status,以防止在未注册的 gen_event 进程上调用 sys:get_status/1 时出现 lists:concat([...,pid()]) 崩溃。
将 gen_* 行为的 format_status 标头代码重构到模块 gen。
扩展 gen_event_SUITE 中的 format_status 测试,以涵盖匿名 gen_event 进程的 format_status 错误。(感谢 Geoff Cant)
内部 ID:OTP-9218
对于动态临时子进程,supervisor 中的 pid 列表已更改为“set”。当添加/删除许多子进程时,访问列表的扩展性不好。(感谢 Evgeniy Khramtsov)
内部 ID:OTP-9242
更改 pool 模块以尝试附加到已运行的节点
对于已运行的节点,pool 模块会打印出错误消息,并且不再执行任何操作。此补丁更改了该行为,因此如果 slave:start/3 的返回是 {already_running, Node},则仍然会尝试附加到该节点。这是有意义的,因为用户已在 .hosts.erlang 文件中指定了该节点,表明希望该节点成为池的一部分,并且在池启动后可以成功手动附加。(感谢 Kelly McLaughlin)
内部 ID:OTP-9244
unicode:记录 16#FFFE 和 16#FFFF(非字符)(感谢 Tuncer Ayaz)
内部 ID:OTP-9256
re:在手册页中删除多余的“it ”(感谢 Tuncer Ayaz)
内部 ID:OTP-9307
已修复 erl_eval(3) 中的一个错误。
内部 ID:OTP-9322
改进和新功能
添加
timer:tc/1
并删除tc/2
和tc/3
中的 catch。因此,时间测量函数将不再捕获由测量的函数引起的退出、错误或抛出。* 潜在的不兼容性 *
内部 ID:OTP-9169
允许 simple_one_for_one supervisor 使用 supervisor:terminate_child(SupRef,Pid)
如果 supervisor 使用重启策略 simple_one_for_one,则之前不允许使用 supervisor:terminate_child/2。现在已更改,因此可以通过指定子进程的 Pid 来终止此类 supervisor 的子进程。
(感谢 Vance Shipley。)
内部 ID:OTP-9201
已添加类型和规范。
内部 ID:OTP-9267
Erlang 类型和规范用于文档。
内部 ID:OTP-9271
允许 Dets 表名称为任意项。
内部 ID:OTP-9282
已修复可能导致 Dialyzer 出现问题的规范。erl_eval 中的不透明类型已转换为普通类型。这是一个临时修复。
内部 ID:OTP-9333
STDLIB 1.17.3
已修复的错误和故障
已更正 io:format 中 ~F.~Ps 的两个错误。当 length(S) >= abs(F) > P 时,精度 P 被错误地忽略。当 F == P > length(S) 时,结果错误地左对齐。Ali Yakout 发现了这个错误,并且也提供了修复程序。
内部 ID:OTP-8989 辅助 ID:seq11741
修复 io 模块中的异常生成
某些函数在 badarg 异常时没有生成正确的 badarg 异常。
内部 ID:OTP-9045
修复 dict 和 orddict 模块文档
修复了语法和一个不一致之处(键 - 值而不是键/值,因为其他地方都使用前者)。(感谢 Filipe David Manana)
内部 ID:OTP-9083
将 ISO 周数计算函数添加到 stdlib 的 calendar 模块
此新功能将缺少的周数函数添加到 stdlib 应用程序的 calendar 模块。该实现符合 ISO 8601 标准。该新功能已实现、测试并记录(感谢 Imre Horvath)。
内部 ID:OTP-9087
改进和新功能
实现 RFC4648 中关于填充字符的“MAY”子句,以使 mime_decode() 和 mime_decode_to_string() 函数更能容忍错误填充的 base64。下面引用 RFC 以供参考。
“RFC4648 第 3.3 节中关于 MIME 解码:此外,如果填充字符“=”出现在编码数据的末尾之前,则此类规范可以忽略该填充字符,将其视为非字母数据。如果在字符串末尾找到的填充字符多于允许的数量(例如,以“===”结尾的 base 64 字符串),则也可以忽略多余的填充字符。”
内部 ID:OTP-9020
supervisor 将不再保存临时进程的启动参数,因为它们不会被重启。对于 simple_one_for_one 工作进程(例如 ssl 连接进程),这将大大减少 supervisor 的内存占用。
内部 ID:OTP-9064
现在可以运行 escript 时添加 -n 标志,escript 将使用 +native 编译。
内部 ID:OTP-9076
STDLIB 1.17.2.1
已修复的错误和故障
标准库的多个类型规范在 R14B01 版本中是错误的。现在已更正。更正涉及 re、io、filename 和 erlang 模块本身的类型。
内部 ID:OTP-9008
STDLIB 1.17.2
已修复的错误和故障
当多个客户端同时访问 Dets 表时,其中一个客户端调用
dets:insert_new/2
,Dets 服务器可能会崩溃。或者,在相同条件下,有时会返回ok
而不是true
。(感谢 John Hughes。)内部 ID:OTP-8856
当多个客户端同时访问 Dets 表时,由于 Dets 文件被截断,有时会丢失插入或更新的对象。(感谢 John Hughes。)
内部 ID:OTP-8898
当多个客户端同时访问 Dets 表时,有时会丢弃 Dets 服务器内部状态的修改。症状各不相同:原因
bad_object
错误;lookup()
没有返回插入的对象;等等。(感谢 John Hughes。)内部 ID:OTP-8899
如果在调用
bchunk/2
、match/1,3
、match_object/1,3
或select/1,3
之后关闭 Dets 表,然后再重新打开,则后续使用返回的延续的调用通常会返回回复。此错误已修复;现在该调用会失败,原因是badarg
。内部 ID:OTP-8903
Cover 没有收集包含 include 指令的 Yecc 分析文件等文件的覆盖率数据。通过修改 Erlang 代码预处理器
epp
,此错误已修复。内部 ID:OTP-8911
如果打开了一个插槽少于键的 Dets 表,然后在仅查找后关闭该表,则内容不再格式良好。此错误已修复。(感谢 Matthew Evans。)
内部 ID:OTP-8923
在 supervisor 中,当它终止一个子进程时,如果该子进程恰好提前退出,且状态为 normal,则 supervisor 会将其报告为错误。这不应报告为错误。
* 潜在的不兼容性 *
内部 ID:OTP-8938 辅助 ID:seq11615
改进和新功能
文档 filelib:wildcard/1,2 现在描述了通配符的字符集语法。
内部 ID:OTP-8879 辅助 ID:seq11683
已防止
erlc
、dialyzer
、typer
、run_test
、heart
、escript
和erlexec
中发生缓冲区溢出。(感谢 Michael Santos。)
内部 ID:OTP-8892
为
string:copies/2
使用浮点数表示副本数会导致无限循环。现在它将失败并抛出异常。(感谢 Michael Santos。)内部 ID:OTP-8915
新的 ETS 选项
compressed
,启用更紧凑的存储格式,但会增加表操作的开销。对于测试和评估,可以使用erl +ec
来强制压缩所有 ETS 表。自有 ID:OTP-8922 辅助 ID:seq11658
Dets 表的默认最大槽位数已更改为等于最大槽位数。(感谢 Richard Carlsson。)
自有 ID:OTP-8959
STDLIB 1.17.1
已修复的错误和故障
文档中已将 ref() 替换为 reference()。
自有 ID:OTP-8733
改进和新功能
如果 fun 头部遮蔽了周围的变量(就像在相同上下文中为普通 fun 获取的警告一样),则 ms_transform 现在会发出警告。
自有 ID:OTP-6759
现在记录了 ets:select_reverse/{1,2,3}。
自有 ID:OTP-7863
已重写了
ethread
库的大部分内容。ethread
库是 Erlang 运行时系统内部使用的可移植线程库,由运行时系统本身使用。最显著的改进是读取器优化的 rwlock 实现,它通过避免 rwlock 缓存行的乒乓效应,极大地提高了多处理器系统上读取锁/读取解锁操作的性能。读取器优化的 rwlock 实现由运行时系统中已知经常被读取锁定的各种 rwlock 使用,并且可以通过在表创建时传递 {read_concurrency, true} 选项在 ETS 表上启用。有关更多信息,请参阅
ets:new/2
的文档。读取器优化的 rwlock 实现可以在启动运行时系统时进行微调。有关更多信息,请参阅 +rg 命令行参数的erl
文档。还有一种新的 rwlock 实现,它没有针对读取器进行优化。这两种实现都在争用期间交错读取器和写入器,而不是像 NPTL (Linux) pthread rwlock 实现那样使用读取器或写入器优先策略。读取器/写入器优先策略是有问题的,因为它会使执行非优先操作的线程饥饿。
新的 rwlock 实现在 ERTS 中的整体性能优于常见的 pthread 实现。但是,在某些极度争用的情况下,情况并非如此。这种高度争用或多或少只能出现在 ETS 表上。当多个进程同时对同一个表执行大量写入锁定操作时会发生这种情况。无论 rwlock 实现如何,这种 ETS 的使用都是不好的,永远不会扩展,并且我们强烈建议不要这样做。
新的 rwlock 实现依赖于原子操作。如果没有找到本地原子实现,将使用回退解决方案。使用回退意味着性能下降。也就是说,现在比以前更重要的是使用本地原子实现来构建 OTP。
ethread
库包含以下平台的本地原子实现:x86(32 位和 64 位)、powerpc(32 位)、sparc V9(32 位和 64 位)和 tilera(32 位)。在其他硬件上,如果存在 gcc 对原子内存访问的内置支持,则将使用它。如果找不到此类支持,configure
将警告没有可用的原子实现。ethread
库现在也可以使用libatomic_ops
库进行原子内存访问。这使得 Erlang 运行时系统可以在比以前更多的平台上利用优化的本地原子操作。如果configure
警告没有可用的原子实现,请尝试使用libatomic_ops
库。使用 --with-libatomic_ops=PATHconfigure
命令行参数,指定libatomic_ops
安装的位置。libatomic_ops
库可以从以下网址下载:http://www.hpl.hp.com/research/linux/atomic_ops/ethread
库的 API 更改也导致了 Erlang 运行时系统的修改。由于“延迟释放”功能依赖于ethread
库,因此也为此功能进行了准备工作。注意:当为 x86 构建时,
ethread
库现在将使用首次出现在奔腾 4 处理器上的指令。如果您希望运行时系统与较旧的处理器(追溯到 486)兼容,则需要在配置系统时传递 --enable-ethread-pre-pentium4-compatibilityconfigure
命令行参数。自有 ID:OTP-8544
由于向后兼容性原因,模块 erlang 中的一些内置函数 (BIF) 从未进行自动导入。由于局部函数现在覆盖了自动导入,因此新的自动导入不再是问题,因此最终以下 BIF 进行了自动导入:monitor/2、monitor/3、demonitor/2、demonitor/3、error/1、error/2、integer_to_list/2、list_to_integer/2。
自有 ID:OTP-8763
STDLIB 1.17
已修复的错误和故障
当解析
file
属性时,Erlang 代码预处理器 (epp
) 向客户端发送了额外的{eof,Location}
形式的消息。此错误是在 R11B 中引入的,现已修复。自有 ID:OTP-8470
抽象类型“fun”无法通过 Erlang 漂亮打印机 (
erl_pp
) 打印。此错误已修复。自有 ID:OTP-8473
当给定单词
spec
时,函数erl_scan:reserved_word/1
不再返回true
。此错误是在 STDLIB-1.15.3 (R12B-3) 中引入的。自有 ID:OTP-8567
lists:keysort/2
的文档声明排序是稳定的。自有 ID:OTP-8628 辅助 ID:seq11576
Shell 的行编辑已得到改进,更类似于 readline 和其他 shell 的行为。(感谢 Dave Peticolas)
自有 ID:OTP-8635
定义宏时,Erlang 代码预处理器 (
epp
) 未正确处理过早的输入结束。此错误是在 STDLIB 1.16 中引入的,现已修复。自有 ID:OTP-8665 辅助 ID:OTP-7810
改进和新功能
实现了来自 EEP31(和 EEP9)的模块二进制文件。
自有 ID:OTP-8217
Erlang 漂亮打印机 (
erl_pp
) 不再在类型中引用原子。自有 ID:OTP-8501
Erlang 代码预处理器 (
epp
) 现在将没有字段的记录视为类型化的。自有 ID:OTP-8503
添加了函数
zip:foldl/3
以迭代 zip 存档。添加了用于创建和提取 escript 的函数。请参阅
escript:create/2
和escript:extract/2
。已删除未记录的函数
escript:foldl/3
。可以使用更灵活的函数escript:extract/2
和zip:foldl/3
来实现相同的功能。记录字段已使用类型信息进行注释。源文件已调整为适合 80 个字符,并且已删除尾随空格。
自有 ID:OTP-8521
Erlang 解析器不再在没有初始值的记录字段类型中复制单例类型
undefined
。自有 ID:OTP-8522
带有多个括号级别的正则表达式可能会导致缓冲区溢出。该问题已得到纠正。(感谢 Michael Santos。)
自有 ID:OTP-8539
定义宏时,点号之前的右括号现在是强制性的。
* 潜在的不兼容性 *
自有 ID:OTP-8562
定义了已编译的 re 模式的一些属性,以允许进行保护测试。
自有 ID:OTP-8577
当名称冲突时,局部函数和导入函数现在覆盖自动导入的 BIF。R14 之前的行为是,自动导入的 BIF 会覆盖局部函数。为避免旧程序更改行为,以下操作会生成错误
- 对与 OTP R14A 之前存在(和自动导入)的自动导入的 BIF 的名称冲突的局部函数进行不带显式模块名称的调用
- 显式导入一个与 OTP R14A 之前存在(和自动导入)的自动导入的 BIF 的名称冲突的函数
- 使用任何形式的旧编译器指令
nowarn_bif_clash
如果 BIF 是在 OTP R14A 或更高版本中添加或自动导入的,则使用导入或局部函数覆盖它只会导致警告,
要解决冲突,您可以使用显式模块名称
erlang
调用 BIF,或者可以使用新的编译器指令-compile({no_auto_import,[F/A]}).
删除该特定 BIF 的自动导入,这将使对局部函数或导入函数的所有不带显式模块名称的调用都通过,而不会出现警告或错误。此更改使得将来可以添加自动导入的 BIF,而不会破坏或悄悄地更改旧代码。但是,一些当前巧妙利用旧行为或
nowarn_bif_clash
编译器指令的代码可能需要更改才能被编译器接受。* 潜在的不兼容性 *
自有 ID:OTP-8579
已删除未记录、不支持和已弃用的函数
lists:flat_length/1
。自有 ID:OTP-8584
已纠正 re 中的一个错误,该错误可能会导致某些正则表达式匹配永远不会终止。(感谢 Michael Santos 和 Gordon Guthrie。)
自有 ID:OTP-8589
现在可以不使用括号访问嵌套记录。有关示例,请参阅参考手册。(感谢 YAMASHINA Hio 和 Tuncer Ayaz。)
自有 ID:OTP-8597
只能读取新创建的引用的
receive
语句现在经过特殊优化,因此它将以恒定时间执行,而与进程的接收队列中的消息数量无关。此优化将使对gen_server:call()
的调用受益。(有关将优化的 receive 语句的示例,请参阅gen:do_call/4
。)自有 ID:OTP-8623
beam_lib:cmp/2 函数现在以更严格的方式比较 BEAM 文件。如果除了编译信息 ("CInf") 块之外有任何更改,则 BEAM 文件将被视为不同。beam_lib:cmp/2 过去会忽略调试信息(对 Dialyzer 非常重要)和其他未直接更改运行时行为的块中的差异。
自有 ID:OTP-8625
当 gen_server、gen_fsm 进程或 gen_event 异常终止时,进程状态的文本表示有时会占用错误日志的多行,具体取决于状态术语的定义。添加了一种从日志中修剪状态部分内容的机制(使用 format_status/2 回调)。请参阅文档。
自有 ID:OTP-8630
对具有全局注册名称但不是原子的进程调用
sys:get_status()
会导致崩溃。已更正。(感谢 Steve Vinoski。)自有 ID:OTP-8656
Erlang 扫描器已使用两个新标记进行了扩充:
..
和...
。自身 ID: OTP-8657
现在可以在类型和函数规范中使用求值为整数的表达式,而之前只允许使用整数(“Erlang_Integer”)。
自身 ID: OTP-8664
编译器对记录操作进行了更好的优化。
自身 ID: OTP-8668
最近添加的 BIF `erlang:min/2`,`erlang:max/2` 和 `erlang:port_command/3` 现在会自动导入(正如它们最初的意图)。由于最近的编译器更改(OTP-8579),对定义了自己的 `min/2`,`max/2` 或 `port_command/3` 函数的旧代码的唯一影响将是警告,本地函数仍将被使用。可以通过在源文件中使用 `-compile({no_auto_import,[min/2,max/2,port_command/3]}).` 来删除警告。
* 潜在的不兼容性 *
自身 ID: OTP-8669 辅助 ID: OTP-8579
现在,`binary_to_term/2` 会自动导入。当且仅当模块具有同名的本地函数时,才会引发编译警告。
* 潜在的不兼容性 *
自身 ID: OTP-8671
预定义的内置类型 `tid()` 已被删除。应该使用 `ets:tid()` 来代替。
* 潜在的不兼容性 *
自身 ID: OTP-8687
STDLIB 1.16.5
修复的错误和故障
由于竞争条件,从多个进程使用 `filelib:ensure_dir/1` 创建相同的路径或同一目录结构的部分时,`filelib:ensure_dir/1` 可能会返回无意义的 `{error,eexist}`。 这种竞争条件已被消除,并且现在只有在存在同名的常规文件、设备文件或其他非目录文件时才会返回 `{error,eexist}`。(感谢 Tuncer Ayaz。)
自身 ID: OTP-8389
修复了许多关于 re 和 unicode 的错误
`re:compile` 不再丢失 unicode 选项,这也修复了 `re:split` 中的错误。
`re:replace` 现在可以处理 unicode 字符列表替换参数
`re:replace` 现在可以正确处理 unicode RE 字符列表参数
`re:replace` 现在在没有替换任何内容时可以正确处理二进制 unicode 输出。
大多数代码、测试用例和错误隔离由 Rory Byrne 完成。
自身 ID: OTP-8394
本机代码的加载在 SMP 仿真器中不是完全原子的,这可能会导致崩溃。此外,本机代码的每个 MFA 信息表现在已受到锁的保护,因为发现在 SMP 仿真器中可以并发访问它。(感谢 Mikael Pettersson。)
自身 ID: OTP-8397
`user.erl`(在旧 shell 中使用)已更新以处理提示字符串中的 unicode (`io:get_line/{1,2}`)。 `io_lib` 也已更新以使用 `'t'` 修饰符格式化提示(即,使用 `~ts` 而不是 `~s`)。
自身 ID: OTP-8418 辅助 ID: OTP-8393
`re` 模块:在具有顶级选择的模式开头带有选项更改的正则表达式可能会导致覆盖和/或崩溃。(感谢 Michael Santos。)
自身 ID: OTP-8438
改进和新功能
恢复了 `gen_server` 和 `gen_fsm` 回调模块在 `sys:get_status/1,2` 调用下格式化自身状态以进行显示的能力,并已记录在案。(感谢 Steve Vinoski。)
自身 ID: OTP-8324
`c:nc/{1,2}` 过去假设 beam 文件是在与源代码相同的目录中创建的,如果不是,则无法加载代码。已更正为在当前目录或由 `
{outdir,Dir}
` 选项指定的目录中查找 beam 文件。(感谢 Alex Suraci。)自身 ID: OTP-8337
在修复了一些错误并在文档构建过程中添加了一些功能后,现在可以在开源环境中构建文档。
- 更新了元数计算。
- 在生成的链接中删除了用于 bif 的函数名称中的模块前缀,因此链接将看起来像 "https://erlang.org.cn/doc/man/erlang.html#append_element-2" 而不是 "https://erlang.org.cn/doc/man/erlang.html#erlang:append_element-2"."。
- 加强了在加载新页面时 html 文档中的菜单定位。
- 对 man 页面的生成进行了一些更正(感谢 Sergei Golovan)
- 法律声明取自 xml 书籍文件,因此 OTP 的构建过程可用于非 OTP 应用程序。
自身 ID: OTP-8343
Shell 标签补全现在适用于带引号的模块和函数名称。(感谢 Ulf Wiger。)
自身 ID: OTP-8383
存档文件中的显式顶级目录现在是可选的。
例如,如果存档 (app-vsn.ez) 仅包含 app-vsn/ebin/mod.beam 文件,则使用存档文件的文件信息作为原点伪造 app-vsn 和 app-vsn/ebin 目录的文件信息。 还可以列出虚拟目录。 简而言之,如果顶层目录不存在,则它们是虚拟的。
自身 ID: OTP-8387
实现了宏重载。(感谢 Christopher Faulet。)
自身 ID: OTP-8388
可以使用新函数
shell:prompt_func/1
和新的应用程序配置参数shell_prompt_func
自定义 Erlang shell 提示符。自身 ID: OTP-8393
改进了 escript 中对类型化记录的处理
自身 ID: OTP-8434
添加了 `supervisor:count_children/1` 来计算正在管理的子进程数量,而不会像 `which_children/1` 那样对内存产生影响。(感谢 Jay Nelson。)
自身 ID: OTP-8436
STDLIB 1.16.4
改进和新功能
现在使用大多数平台上都存在的开源工具(xsltproc 和 fop)构建文档。一个明显的变化是删除了框架。
自身 ID: OTP-8201
[escript] 删除了 escript 中第一行必须以
#!
开头的限制。[escript] 现在已经记录了一些 escript 可执行文件的命令行选项。 例如,您只需添加一个命令行选项即可在调试器中运行 escript。
[escript] 澄清了 escript 标头语法的文档。 例如,标头是可选的。 这意味着可以直接“执行”
.erl
、.beam
和.zip
文件。自身 ID: OTP-8215
优化了 `array:from_orddict/1`,如果 orddict 是稀疏的,现在它会更快并且使用更少的内存。
更改了 `array:reset/2`,现在它永远不会像以前那样为非固定数组扩展数组。 请参阅文档。
自身 ID: OTP-8216
Erlang Pretty Printer (
erl_pp
) 现在将列表推导式的前导[
以及位字符串推导式的前导<<
放在单独的行上,以便公开模板的 Cover 计数器。自身 ID: OTP-8227
编译器现在可以识别用于 Leex 输入文件的扩展名 ".xrl"。
自身 ID: OTP-8232
在处理来自父进程的
'EXIT'
消息时,文档中对gen_server
、gen_fsm
和gen_event
行为做出了一些澄清。 有关更多信息,请参阅gen_server
、gen_fsm
和gen_event
文档。自身 ID: OTP-8255 辅助 ID: seq11419
-on_load() 指令可用于在加载模块时运行函数。 它在参考手册中关于代码加载的部分中有记录。
自身 ID: OTP-8295
STDLIB 1.16.3.1
修复的错误和故障
`gen:start/6` 的错误类型规范导致 dialyzer 在将
{spawn_opt, SpawnOptionList}
传递到 `gen_server` 和 `gen_fsm` 启动函数的选项列表时错误地发出警告。自身 ID: OTP-8068 辅助 ID: seq11323, seq11314
STDLIB 1.16.3
修复的错误和故障
linter 过去会在无效的
-opaque
声明上崩溃。自身 ID: OTP-8051
修复了
digraph:add_edge/5
和digraph:del_path/3
中的错误。(感谢 Crystal Din。)自身 ID: OTP-8066
当尝试使用
dets:insert_new()
将对象插入类型为duplicate_bag
的 Dets 表时,有时会复制已存在的对象。 此错误已修复。(感谢 Crystal Din。)自身 ID: OTP-8070
在非常深的目录(路径长度超过 256 个字符)中运行 erlc 会导致仿真器在调用
list_to_atom/1
时崩溃。(感谢 Chris Newcombe。)自身 ID: OTP-8124
Erlang 代码预处理器 (
epp
) 中修复了一些小错误。自身 ID: OTP-8130
修复了 Erlang 元解释器(
erl_eval
)中的一个错误:位字符串推导式的模板中生成的异常没有得到正确处理。(感谢 Ulf Wiger。)自身 ID: OTP-8133
改进和新功能
在
re:run/3
的文档中缺少选项{capture,none}
。自身 ID: OTP-8113
当
erl_scan:tokens()
返回错误元组{error, ErrorInfo, EndLocation
} 时,列表LeftOverChars
是输入数据的剩余字符,从EndLocation
开始。 它以前是空列表。* 潜在的不兼容性 *
自身 ID: OTP-8129
在解释
receive
表达式时,Erlang 元解释器 (erl_eval
) 得到了一些优化。(感谢 Richard Carlsson。)自身 ID: OTP-8139
Erlang Pretty Printer (
erl_pp
) 已被修改为处理类型。自身 ID: OTP-8150
STDLIB 1.16.2
修复的错误和故障
当给出
text
选项并且StartLocation
是一行时,Erlang 扫描器 (erl_scan
) 返回的 token 文本有时为空。 此错误已修复。自身 ID: OTP-7965
更新了
base64:decode/1
的文档,以指出它会去除空格。base64:decode/1
和base64:mime_decode/1
有时会失败,而不是去除非 base64 字符。自身 ID:OTP-7984
gen
模块中的两种类型已更正。自身 ID:OTP-8029 辅助 ID:seq11296
array:from_orddict([])
和array:from_list([])
将构造固定数组而不是可扩展数组。自身 ID:OTP-8033
改进和新特性
解释型 escript 现在是尾递归的。
引入了函数 erl_eval:expr/5。
自身 ID:OTP-7933
如果调用进程的消息队列中有许多消息,则
gen_server:call/2,3
的速度会略快一些。自身 ID:OTP-7979
Random 现在支持使用元数为 1 的种子,
random:seed/1
,它接受一个三元组。自身 ID:OTP-8019
regexp
模块现在可以识别转义序列\xXY
和\x{X...}
。自身 ID:OTP-8024
STDLIB 1.16.1
修复的错误和故障
dets:open_file/1
的文档现在说明,如果文件未正确关闭,则会对其进行修复。(感谢 Ulf Wiger。)自身 ID:OTP-7895
改进和新特性
当起始位置为行和列的组合时,Erlang 扫描器不再返回标记的文本,除非提供了新选项
text
(与 R13A 不兼容)。有新的函数可以访问标记的属性:
attributes_info/1,2
和set_attribute/3
。* 潜在的不兼容性 *
自身 ID:OTP-7892 辅助 ID:OTP-7810
R13A 的 Unicode 和 I/O 系统实现中的几个小故障和性能问题已得到纠正。
自身 ID:OTP-7896 辅助 ID:OTP-7648 OTP-7887
filelib:wildcard/2 的类型规范已更正。
自身 ID:OTP-7915
新函数:
gb_sets:is_disjoint/2
、ordsets:is_disjoint/2
和gb_sets:is_disjoint/2
。自身 ID:OTP-7947
R13A 中添加的函数
gb_trees:map/2
现在已记录在案。自身 ID:OTP-7948
STDLIB 1.16
修复的错误和故障
修复了
gen_server:start*
中的一个小的竞争条件:如果这些函数之一返回{error,Reason}
或ignore
,则该名称仍然可以注册(本地或在global
中)。由
proc_lib
启动的进程在某些情况下依赖于其进程字典不被擦除,并且在异常终止时会崩溃,而不会生成正确的崩溃报告。这已得到纠正(但如果进程字典已被擦除,则初始调用将不会显示在错误报告中)。注意:不再需要出于内存节约原因而擦除进程字典,因为实际的调用参数不再保存在进程字典中。自身 ID:OTP-7669
Erlang 预处理器在字符串化宏参数时使用了错误的行号。(感谢 John Hughes。)
自身 ID:OTP-7702
修复了
qlc
模块中的一个错误:合并连接有时无法返回所有答案。(感谢 Bernard Duggan。)自身 ID:OTP-7714
改进和新特性
一个新的选项
key_equality
已添加到qlc:table/2
中。此选项使qlc
可以更好地处理在比较键的相等性时使用==/2
的表(此类表的示例是 qlc(3) 中的有序 ETS 表和 gb_table)。自身 ID:OTP-6674
函数
lists:seq/1,2
在某些情况下返回空列表,而以前它们会生成异常,例如lists:seq(1, 0)
。有关详细信息,请参见 lists(3)。(感谢 Richard O'Keefe。)* 潜在的不兼容性 *
自身 ID:OTP-7230
现在记录了在选择有序集时访问对象的顺序。
自身 ID:OTP-7339
现在可以在 escript 和存档中调试代码。
自身 ID:OTP-7626
Unicode 的支持按照 EEP10 中的描述实现。io 和 io_lib 模块支持终端和文件中 Unicode 数据的格式化和读取。可以使用自动转换为和来自不同 Unicode 格式的模式打开文件。“unicode”模块包含用于在外部和内部 Unicode 格式之间进行转换的函数,re 模块支持 Unicode 数据。还有用于指定超出 ISO-latin-1 范围的字符串和字符数据的语言语法。
当终端和操作系统支持时,交互式 Shell 将支持 Unicode 字符的输入和输出。
有关详细信息,请参见 EEP 和 io/io_lib 手册页以及 stdlib 用户指南。
I/O 协议不兼容性
io_Server 和客户端之间的 io协议已更新以处理 Unicode 格式的协议数据。更新的协议现在已记录在案。该规范位于 stdlib _用户手册中,这是手册的新部分。
io 模块不兼容性
io:putchars、io:get_chars 和 io:get_line 都处理并返回 Unicode 数据。在可以提供二进制数据的情况下(如 io:put_chars),它们应以 UTF-8 编码。当返回二进制数据时(如当 io_server 设置为 _binary 模式时,io:get_line/get_chars 返回),返回的数据也始终以 UTF-8 编码。但是,文件模块仍然返回面向字节的数据,因此可以使用 file:read 而不是 io:get_chars 来读取 ISO-latin-1 中的二进制数据。
io_lib 模块不兼容性
io_lib:format 在给定新的格式指令(即“~ts”和“~tc”)时,可以返回包含大于 255 的整数的列表。
* 潜在的不兼容性 *
自身 ID:OTP-7648 辅助 ID:OTP-7580 OTP-7514 OTP-7494 OTP-7443 OTP-7181 EEP10 EEP11
如果节点已经附加,则函数
pool:attach/1
现在返回already_attached
,而不是allready_attached
(原文如此)。(感谢 Edwin Fine。)自身 ID:OTP-7653 辅助 ID:OTP-7603
现在允许在 escript 中使用预处理器指令。这意味着例如可以在 escript 中使用宏。
自身 ID:OTP-7662
当使用
proc_lib
、gen_server
或gen_fsm
启动的进程以原因{shutdown,Term}
退出时,将不再生成崩溃报告(以允许干净地关闭,但仍然向链接到终止进程的进程提供其他信息)。自身 ID:OTP-7740 辅助 ID:seq10847
添加了一个新的 BIF,
lists:keyfind/3
。它的工作方式类似于lists:keysearch/3
,只是在成功的情况下,它不会将返回的元组包装在value
元组中。(感谢 James Hague 建议此功能。)自身 ID:OTP-7752
lists:suffix(Suffix, List)
过去具有length(Suffix)*length(List)
的复杂度(对于某些输入,这可能会变得非常慢)。现在已重新实现,因此其复杂度为length(Suffix)+length(List)
。(感谢 Richard O'Keefe 提供了新的实现。)自身 ID:OTP-7797
Erlang 扫描器已增强,可以返回空格、注释和标记的精确位置。函数
string/3
、tokens/4
和token_info/1,2
是新的。有关详细信息,请参见 erl_scan(3)。tokens/3,4
已被修改为在遇到点之前的eof
时返回标记列表,而不是返回错误。自身 ID:OTP-7810
filelib:fold_files/5
现在使用re
模块而不是regexp
模块进行正则表达式匹配。实际上,对于用于filelib:fold_files/5
的大多数正则表达式,此更改不会成为问题。(正则表达式的主要区别在于,regexp
将圆括号和花括号视为文字字符,而re
将它们视为特殊字符;幸运的是,这些字符很少用于文件名中。)* 潜在的不兼容性 *
自身 ID:OTP-7819
如果
Type
不是有效类型,digraph:new(Type)
现在将引发badarg
异常。同样,如果参数无效,则digraph_utils:subgraph/2,3
现在将引发badarg
。(如果出现问题,这些函数过去会返回错误元组。)* 潜在的不兼容性 *
自身 ID:OTP-7824
传递给
random:uniform/1
的参数现在必须是整数(如文档中所述)。在以前的版本中,也允许使用浮点数。* 潜在的不兼容性 *
自身 ID:OTP-7827
版权声明已更新。
自身 ID:OTP-7851
向 dbg:fun2ms 添加了一些缺失的匹配规范函数:exception_trace/0 和 trace/2,3。
有一个新的函数 queue:member/2。
修复了 io_lib:fread 中的一个错误,该错误导致它意外地连接了以换行符分隔的字段。由 Matthew Palmer 向 erlang-patches 报告并分析。
自身 ID:OTP-7865
STDLIB 1.15.5
修复的错误和故障
修复了
qlc
模块中的一个错误:当合并连接两个查询句柄时,用于等价类的临时文件没有被正确截断,这可能会导致性能不佳。自身 ID:OTP-7552
字符 16#C0 和 16#E0(带有重音符的“A”和“a”)未被
string:to_lower/1
和string:to_upper/1
函数正确转换。(感谢 Richard O'Keefe。)自身 ID:OTP-7589
如果节点已经附加,则函数
pool:attach/1
现在返回already_attached
,而不是allready_attached
(原文如此)。(感谢 Edwin Fine。)* 潜在的不兼容性 *
自身 ID:OTP-7603
io:get_line/1,2
的文档现在提到返回值也可以是{error,Reason}
。自身 ID:OTP-7604 辅助 ID:seq11063
改进和新特性
现在 re 库中添加了 split 函数。来自 run、replace 和 split 的异常和错误处理更加一致。
内部 ID: OTP-7514 辅助 ID: OTP-7494
使用
proc_lib
产生的进程(包括gen_server
和其他使用proc_lib
的库模块)不再保留初始调用的完整参数列表,而只保留参数的数量。此外,如果使用
proc_lib:spawn/1
派生一个 fun,则不会保留实际的 fun,而只保留实现该 fun 的模块、函数名称和参数数量。更改的原因是,保留初始的 fun(或参数列表中的 fun)会阻止模块的代码升级。另一个原因是,保留 fun 和函数参数可能会浪费大量内存。
此更改的缺点是,崩溃报告将提供关于初始调用的不太精确的信息(只有
模块:函数/参数数量
,而不是模块:函数(参数)
)。函数proc_lib:initial_call/1
仍然返回一个列表,但每个参数都已替换为虚拟原子。内部 ID: OTP-7531 辅助 ID: seq11036
现在实验性地支持从存档文件加载代码。有关更多信息,请参阅
code
、init
、erl_prim_loader
和escript
的文档。escripts
的错误处理得到了改进。现在,
escript
可以为模拟器设置显式参数,例如-smp enabled
。现在,
escript
可以包含预编译的 beam 文件。现在,
escript
可以包含一个包含一个或多个应用程序的存档文件(实验性)。内部模块
code_aux
已被移除。内部 ID: OTP-7548 辅助 ID: otp-6622
启用了对 ZIP 存档中应压缩的文件类型的显式控制。
内部 ID: OTP-7549 辅助 ID: otp-6622
在作业控制模式下,"s" 和 "r" 命令现在接受可选参数来指定要启动的 shell。(感谢 Robert Virding。)
内部 ID: OTP-7617
STDLIB 1.15.4
修复的错误和故障
日历模块中的一个错误可能导致 calendar:local_time_to_universal_time_dst/1 为没有 DST 的时区中的本地时间返回重复的相同值。仅当本地时间由于从 DST 切换到非 DST 而在出现两次的小时内时,才应返回多个值,并且肯定仅在具有 DST 的时区中才应返回。现在已实现正确的行为。
内部 ID: OTP-7344 辅助 ID: seq10960
已更正
(d)ets:init_table()
的文档。(感谢 Paul Mineiro。)内部 ID: OTP-7413
删除了 R12B-0 中为函数
io:fwrite/2,3
和io_lib:fwrite/2
的控制序列p
和P
引入的每行非空白字符数的 60 个的软上限。这意味着打印表示适合一行的项将没有 NEWLINE。但是,Erlang shell 仍使用 60 个字符的限制。内部 ID: OTP-7421 辅助 ID: OTP-6708
已从 Dets 中删除一些调试代码。
内部 ID: OTP-7424
已更正
dets:match_delete/2
的文档。(感谢 Paul Mineiro。)内部 ID: OTP-7445
digraph(3) 的更正。(感谢 Vlad Dumitrescu。)
内部 ID: OTP-7492
对于 escript 运行的进程,
trap_exit
进程标志现在为false
,而不是true
(如先前版本)。依赖于先前(违反直觉的)行为的脚本可能无法工作。(感谢 Bengt Kleberg。)* 潜在的不兼容性 *
内部 ID: OTP-7517
改进和新特性
现在
lists:(u)sort/2
的文档说明了对排序函数的期望。内部 ID: OTP-7489
re 模块扩展了重复匹配(全局选项)和替换函数。
内部 ID: OTP-7494 辅助 ID: OTP-7181
现在,Erlang shell 在评估未定义的命令时会显示更友好的错误消息。(感谢 Richard Carlsson。)
内部 ID: OTP-7495
STDLIB 1.15.3
修复的错误和故障
zip:unzip 到/从带有空目录的二进制文件不起作用。(感谢 Martin Dvorak。)
内部 ID: OTP-7248
现在
io_lib
模块的控制序列w
的文档说明了浮点数的精确打印。内部 ID: OTP-7324 辅助 ID: OTP-7084
zip:unzip 不支持 jar 文件中找到的 zip 格式的变体。
内部 ID: OTP-7382 辅助 ID: seq10970
改进和新特性
向模拟器添加了一个实验性模块 "re",该模块接口了一个公开可用的用于类 Perl 正则表达式 (PCRE) 的正则表达式库。该接口纯粹是实验性的,并且将会发生更改。
该实现用于参考和测试,与相关的 EEP 相关。
内部 ID: OTP-7181
STDLIB 1.15.2
修复的错误和故障
当插入许多小对象时,Dets 在达到最大槽数时有时会崩溃。(感谢 Daniel Goertzen。)
内部 ID: OTP-7146
当评估器进程被杀死时,链接到 Erlang shell 的进程没有收到退出信号。此错误是在 R12B-0 中引入的,现已修复。
内部 ID: OTP-7184 辅助 ID: OTP-6554
对
ets:update_counter/3
的无效参数处理不正确。小于 1 的元组位置 (Pos
) 导致直接跟在键后面的元素被更新(就像根本没有指定位置一样)。现在,所有Pos
的无效值都会失败并返回badarg
。内部 ID: OTP-7226
对于某些终端,io:columns/0 可能返回 0 而不是 enotsup。现在已更正。
内部 ID: OTP-7229 辅助 ID: seq10886
qlc:info()
现在可以处理端口标识符、pid、引用和 fun。(感谢 Wojciech Kaczmare 报告此错误。)当评估发送到调用
qlc:cursor()
的进程的parent_fun
消息时,有时会被错误地消耗掉。此错误已修复。内部 ID: OTP-7232
erl_parse:abstract()
现在可以处理位字符串。内部 ID: OTP-7234
改进和新特性
已重写
queue
模块,使其更易于使用。2007 年 12 月,来自 Lev Walkin、Anders Ramsell 和 Rober Virding 等人的建议和讨论,在 [email protected] 上。还讨论了更改内部表示以包含长度信息,这将加快len/1
的速度,但该更改已推迟。任何有兴趣的人都可以编写一个 EEP,并尝试为队列开销达成一个可接受的折衷方案,从而提高除len/1
之外的所有其他操作的速度。queue
模块现在针对快速和最小垃圾in/2
和out/1
等进行了优化。请参阅文档。新函数:
is_queue/1
、get/1
、get_r/1
、peek/1
、peek_r/1
、drop/1
、drop_r/1
和liat/1
。is_queue/1
是一个新的谓词,liat/1
是对旧拼写错误的修正,其他函数(get
*、peek
* 和drop
*)是新的接口函数。内部 ID: OTP-7064
当涉及写入浮点数时,函数
io_lib:write/1,2
和io_lib:print/1,4
已更改。此更改会影响io_lib
模块的控制序列p
、P
、w
和W
。(感谢 Bob Ippolito 的代码贡献。)内部 ID: OTP-7084
更新了
erlang:function_exported/3
和io:format/2
函数的文档,不再声明这些函数主要用于向后兼容。内部 ID: OTP-7186
一个新的 BIF ets:update_element/3。用于更新 ets 元组内的单个元素,而无需读取、更新和写回整个元组。
内部 ID: OTP-7200
现在,
string:join/2
接受空列表作为第一个参数。内部 ID: OTP-7231 辅助 ID: OTP-6671
qlc:info/1,2
接受一个新选项depth
。qlc:table/2
的描述中使用的类型SelectedObjects
已被扩充。内部 ID: OTP-7238
文档中已将
tuple_size/1
和byte_size/1
替换为size/1
。内部 ID: OTP-7244
STDLIB 1.15.1
修复的错误和故障
Ets:select/3 与 ets:repair_continuation/2 和 ordered_set 数据表结合使用时,可能会导致 function_clause,即使按预期使用。现在已更正。感谢 Paul Mineiro 发现并隔离了该错误!
内部 ID: OTP-7025
现在,已弃用函数
ftp:close/1
的编译器警告提到了正确的替换函数。已删除的
httpd_util
模块中的函数的警告已更改为说明它们已被删除,而不仅仅是已弃用。(感谢 Fredrik Thulin。)内部 ID: OTP-7034 辅助 ID: seq10825
在
(Expr)#r{}
(未更新任何字段)中,Expr
不再被多次求值。还有一个测试,用于检查Expr
是否是正确的记录类型。(感谢 Dominic Williams。)内部 ID: OTP-7078 辅助 ID: OTP-4962
文档错误修复和澄清。
(感谢 Joern ([email protected])、Matthias Lang 和 Richard Carlsson。)
内部 ID: OTP-7079
使用匹配规范遍历 QLC 表时,重复的对象有时不会从答案列表中删除。(感谢 Dmitri Girenko。)
自有 ID:OTP-7114
改进和新特性
文档已更新,以反映 Erlang shell 的最新更新以及
io_lib
模块的控制序列p
的细微修改。已从代码示例和 Erlang shell 示例中删除多余的空行。
自有 ID:OTP-6944 辅助 ID:OTP-6554、OTP-6911
tuple_size/1
和byte_size/1
已替换为size/1
。自有 ID:OTP-7009
现在可以休眠 gen_server/gen_event/gen_fsm。在 gen_server 和 gen_fsm 中,通过返回原子 'hibernate' 而不是超时值来触发休眠。在 gen_event 的情况下,休眠由事件处理程序返回一个包含原子 'hibernate' 的额外元素的元组来触发。
自有 ID:OTP-7026 辅助 ID:seq10817
一些未记录的调试功能已添加到 Dets 中。
自有 ID:OTP-7066
函数
digraph_utils:is_tree/1
、digraph_utils:is_arborescence/1
和digraph_utils:arborescence_root/1
是新增的。自有 ID:OTP-7081
如果记录更新代码由多个源代码行组成,编译器可能会为记录更新生成次优代码。
自有 ID:OTP-7101
STDLIB 1.15
已修复的错误和故障
qlc
中已修复错误。- 将
qlc:table/2
的lookup_fun
选项设置为undefined
可能会导致崩溃。 - 如果 QLC 以某种方式限制了表的某个列,从而可以使用匹配规范进行遍历,并且 QLC 还将表的键列或某些索引列与另一个表的列进行比较,则
qlc
总是选择首先遍历表,而从不考虑查找连接。这一点已更改,以便始终首选查找连接;如果需要使用匹配规范进行初始遍历,则需要重写查询,引入一个额外的 QLC,其中包含限制列的过滤器。 - 当尝试查找匹配规范和查找的候选项时,仅使用一个生成器的变量的过滤器将被忽略,除非它们紧跟在生成器之后,并且可能紧跟在其他使用相同生成器的变量的过滤器之后。特别是,连接两个表的过滤器不应放置在生成器和仅使用生成器的过滤器之间。
- 用于实现 QLC 表的回调函数
TraverseFun
允许返回除列表之外的其他项,因为 STDLIB 1.14 (OTP-5195)。但是,当返回的项是一个函数时,qlc
通常会尝试调用该函数,而不是返回它。
也实现了一些小的优化。
自有 ID:OTP-6673
- 将
已修复一个关于从 shell 使用参数化模块的错误。
自有 ID:OTP-6785
已在
erl_eval
模块中修复了一个关于位语法的大小表达式的错误。自有 ID:OTP-6787
log_mf_h 事件处理程序在读取完索引文件后没有关闭索引文件,导致文件描述符泄漏。
自有 ID:OTP-6800
已将
filename()
和dirname()
类型的定义添加到filelib
模块的文档中。自有 ID:OTP-6870
对于足够奇怪的文件系统问题,例如写入已满的文件系统,file:write_file/3、file:write/2 和 file:read/2 可能会崩溃(与文档相反)。此错误现已更正。
在此过程中,文件模块已重写以生成更好的错误代码。Posix 错误代码现在源自 OS 文件系统调用,或者仅针对非常相似的原因生成(例如,如果内存分配失败,则生成“enomem”,如果 Erlang 中的文件句柄是文件句柄但当前无效,则生成“einval”)。
现在会生成更多 Erlang 式的错误代码。例如,如果参数不是文件句柄类型,则现在从
file:close/1
返回{error,badarg}
。请参阅 file(3)。已删除使用
file:write/2
写入单个字节的可能性,而不是一个字节的列表或二进制文件,这与文档相矛盾。* 潜在的不兼容性 *
自有 ID:OTP-6967 辅助 ID:OTP-6597 OTP-6291
已在
erl_eval
中修复了一个关于++/2
运算符求值的错误。(感谢 Matthew Dempsky。)自有 ID:OTP-6977
改进和新特性
内部函数 gen:call/3,4 的行为已稍微更改,在极少数情况下,当调用者链接到被调用服务器,并且服务器在调用期间崩溃时;其退出信号被 gen:call/3,4 代码消耗并转换为退出异常。此退出信号不再被消耗。
要注意到此更改,1) 调用进程必须链接到被调用服务器。
调用不能按名称远程,即它必须是按 pid 本地或远程、按名称本地或按名称全局。
调用进程必须设置
process_flag(trap_exit, true)
。服务器必须在调用期间崩溃。
调用进程必须对在其消息队列中获取先前消耗的
{'EXIT',Pid,Reason}
消息敏感。
旧的行为曾经是客户端注意到服务器是否死掉的唯一方法,但自从
erlang:monitor(process, {Name,Node})
被引入并在 gen:call 中使用以来,如果不是错误,则被视为不希望的行为。受影响的用户 API 包括:
gen_server:call/2,3
、gen_fsm:sync_send_event/2,3
、gen_fsm:sync_send_all_state_event/2,3
、gen_event:_
、sys:_
,以及可能还有一些其他几乎不会被注意到的 API。* 潜在的不兼容性 *
自有 ID:OTP-3954 辅助 ID:Seq 4538
当发生异常时,Erlang shell 现在以更清晰的方式(而不是像以前那样转储原始的 EXIT 元组)显示类、原因和堆栈跟踪。
proc_lib:format/1
以同样更清晰的方式显示崩溃报告的异常。新的 shell 命令
catch_exception
和新的应用程序配置参数shell_catch_exception
可用于捕获通常会导致 Erlang shell 退出的异常。自有 ID:OTP-6554 辅助 ID:OTP-6289
函数
string:join/2
使用分隔符连接列表中的字符串。示例:'string:join(["a", "b", "c"], ", ")
给出 "a, b, c"'自有 ID:OTP-6671
函数
io:fwrite/2,3
和io_lib:fwrite/2
的Format
参数的控制序列P
现在在打印元组和列表时插入更少的分行符。引入了每行非空白字符数软上限 60。自有 ID:OTP-6708
新模块
array
提供快速的函数式数组实现。自有 ID:OTP-6733
长期以来已弃用的函数现已从以下模块中删除:
dict
、erl_eval
、erl_pp
、io
、io_lib
、lists
、orddict
、ordsets
、sets
和string
。未记录的函数
lists:zf/3
也已删除(请改用列表推导或lists:zf/2
)。* 潜在的不兼容性 *
自有 ID:OTP-6845
对 file:pread/2 和 file:pread/3 的文档进行了一些小的更正。
自有 ID:OTP-6853
Kernel 和 STDLIB 中模块的 Contract 指令。
自有 ID:OTP-6895
已删除在多个版本中已弃用的
ets:fixtable/2
函数。已将
ets:info/1
函数重新实现为 BIF,这保证了返回的信息是一致的。如果第二个参数无效,
ets:info/2
函数现在会因badarg
原因而失败。(可以使用 Dialyzer 来查找第二个参数拼写错误的错误代码。)* 潜在的不兼容性 *
自有 ID:OTP-6906
Erlang 漂亮的打印机
erl_pp
现在插入更多换行符,以便于Cover
进行行覆盖率分析。(感谢 Thomas Arts。)自有 ID:OTP-6911
关于在表遍历期间插入对象时会发生什么,现在 ets:safe_fixtable/2、ets:foldl/3 和 ets:foldr/3 的文档更加清晰。
自有 ID:OTP-6928 辅助 ID:seq10779
现在可以将 tar 文件中的文件直接提取到二进制文件中。也可以直接从二进制文件中将文件添加到 tar 文件中。
自有 ID:OTP-6943
函数
keystore/4
和keytake/3
是lists
模块中的新增函数。自有 ID:OTP-6953
新的
qlc
选项tmpdir_usage
可用于在即将创建临时文件时将消息输出到错误记录器,或者完全禁止使用临时文件。自有 ID:OTP-6964
STDLIB 1.14.5.3
改进和新特性
更新了 -type() 和 -spec() 的允许语法。
自有 ID:OTP-6861 辅助 ID:OTP-6834
STDLIB 1.14.5.2
改进和新特性
为了向前兼容,编译器将忽略 R12B 版本中将引入的 -type() 和 -spec() 属性。
自有 ID:OTP-6834
STDLIB 1.14.5.1
修复的 Bug 和故障
log_mf_h 事件处理程序在读取完索引文件后没有关闭索引文件,导致文件描述符泄漏。
自有 ID:OTP-6800
改进和新特性
dict:size/1 和 orddict:size/1 函数已添加文档。
自有 ID: OTP-6818
STDLIB 1.14.5
修复的 Bug 和故障
已修复 Dets 中关于比较 (==) 和匹配 (=:=) 的 Bug。
已更新 STDLIB 手册页面,以更仔细地说明何时匹配术语以及何时比较术语。
自有 ID: OTP-4738 辅助 ID: OTP-4685
已更新 shell 以修复以下缺陷:如果不使用 oldshell,shell 进程退出后会留下一个无响应的初始 shell。使用不存在的回调模块启动受限 shell 会导致 shell 无法使用任何命令,甚至无法使用 init:stop/0。当 restricted_shell 处于活动状态时,Fun 不能用作本地 shell 函数(在 shell_default 或 user_default 中)的参数。
自有 ID: OTP-6537
已修复 QLC 的解析转换中的 Bug。
自有 ID: OTP-6590
已修复关于
lists:sort/1
和lists:keysort/2
以及浮点数和整数混合使用的 Bug。自有 ID: OTP-6606
在 Erlang shell 中调用
erlang:garbage_collect/0
时,不仅会对求值器进程(通过在 Erlang shell 中调用self/0
返回的进程)进行垃圾回收,还会对保存历史记录列表的进程进行垃圾回收。自有 ID: OTP-6659
beam_lib
模块中曾经捕获异常并返回元组{'EXIT',Reason}
的函数现在会以 reasonReason
退出。自有 ID: OTP-6711
现在,每当计算运算符时(异常是
andalso
、orelse
和catch
),erl_eval
模块都会调用非本地函数处理程序。现在,当函数或运算符出现在 guard 测试中时,也会调用非本地函数处理程序(以前这些调用会被忽略)。这些更改会影响在受限模式下运行的 Erlang shell:现在会为
'!'/2
等运算符调用回调函数non_local_allowed/3
。这意味着可能需要更改non_local_allowed/3
以便让运算符通过。请注意,为了停止 shell 中的消息传递,必须限制erlang:'!'/2
以及erlang:send/2,3
。* 潜在的不兼容性 *
自有 ID: OTP-6714 辅助 ID: seq10374
改进和新特性
新的编译器选项
warn_obsolete_guard
可用于为调用旧的类型测试 BIF 启用警告。自有 ID: OTP-6585
对于使用
escript
编写的脚本,有一个新的函数escript:script_name/0
,可用于检索脚本的路径名。文档已澄清有关诸如 ?MODULE 和模块名称等预定义宏的信息。自有 ID: OTP-6593
小的 Makefile 更改。
自有 ID: OTP-6689 辅助 ID: OTP-6742
STDLIB 1.14.4
修复的 Bug 和故障
已更改
code:module_md5/1
、beam_lib:md5/1
和编译器为vsn
属性的默认值所做的 BEAM 文件的 MD5 计算,以便其结果在所有平台上都相同;包含 fun 的模块在不同平台上可能会获得不同的 MD5 值。自有 ID: OTP-6459
当使用
file_sorter
模块对术语进行排序时(选项Format
设置为term
),并非总是能正确处理文件错误。此 Bug 已修复。除非实际使用,否则不再检查使用
tmpdir
选项提供的目录。不再返回错误原因not_a_directory
;而是返回file_error
元组。自有 ID: OTP-6526
已修复
erl_eval
模块中关于try
/catch
的 Bug。自有 ID: OTP-6539
当对连接操作的操作数进行排序时,QLC 使用错误的参数调用
file:open/3
。此 Bug 已修复。自有 ID: OTP-6562 辅助 ID: seq10606
改进和新特性
已更新函数
beam_lib:cmp/1
和beam_lib:strip/1
(以及类似函数),以便更通用地处理可选块(例如“FunT”),以实现未来的兼容性。已添加函数
beam_lib:chunks/3
。已添加函数
beam_lib:md5/1
。自有 ID: OTP-6443
将 base64 作为模块添加到 stdlib,进行编码和解码。
自有 ID: OTP-6470
将函数 to_upper/1 和 to_lower/1 添加到 string 模块。这些函数为 ISO/IEC 8859-1 字符 (Latin1) 和字符串提供大小写转换。
自有 ID: OTP-6472
受限 shell 使用的回调函数
non_local_allowed/3
现在可以返回值{{restricted,NewFuncSpec,NewArgList},NewState}
,该值可用于让 shell 调用其他函数,而不是指定的函数。自有 ID: OTP-6497 辅助 ID: seq10555
有一个新的
escript
程序,可用于使用 Erlang 编写脚本。Erlang 脚本不需要编译,并且可以将任何参数传递给它们,而不会有被 Erlang 系统解释的风险。自有 ID: OTP-6505
现在允许
io:fwrite/2,3
和io_lib:fwrite/2
函数的Format
参数为二进制。自有 ID: OTP-6517
STDLIB 1.14.3.1
修复的 Bug 和故障
当应用于二进制时,
io:fwrite/2,3
和io_lib:fwrite/2
函数的Format
参数的控制序列p
和P
可能会导致badarg
故障。此 Bug 在 STDLIB 1.14.3 中引入。(感谢 Denis Bilenko。)自有 ID: OTP-6495
改进和新特性
添加了选项 {cwd, Dir},以便使用相对路径名创建 zip 存档,而无需执行(全局)file:set_cwd。
自有 ID: OTP-6491 辅助 ID: seq10551
STDLIB 1.14.3
修复的 Bug 和故障
spawn_opt/2,3,4,5
选项monitor
(在 Kernel 2.11.2 中引入)目前在使用proc_lib
启动进程时,即在启动 gen_server、gen_fsm 等时,无法使用。此限制现已正确记录,并且在提供此选项时,
gen_fsm
、gen_server
和proc_lib
start
和start_link
函数的行为已从无限期挂起更改为以原因badarg
失败。(感谢 Fredrik Linder)
自有 ID: OTP-6345
改进和新特性
现在,当达到最大深度时,
io:fwrite/2,3
和io_lib:fwrite/2
函数的Format
参数的控制序列P
会将二进制字符串的尾部替换为...
。例如,io:fwrite("~P", [<<"a binary string">>, 3]).
打印<<"a binary"...>>
。缩进会更加注意不超出右边距(如果可能)。
如果在打印元组时达到最大深度,则打印
,...
而不是|...
(此更改也适用于控制序列W
)。自有 ID: OTP-6354
现在,打印历史记录列表的 Erlang shell 命令
h/0
避免打印v/1
引用的(巨大)术语,而是只打印对v/1
的调用。自有 ID: OTP-6390
STDLIB 1.14.2.2
修复的 Bug 和故障
已更改函数
dets:select/1,3
、dets:match/1,3
和dets:match_object/1,3
,以便永远不返回{[],Continuation}
。此更改会影响 Mnesia 中的相应函数。已修复 QLC 中的 Bug:如果
tmpdir
选项未指定有效的目录,qlc:info()
可能会崩溃;查找键的结果保存在 RAM 中,这应该可以提高性能。自有 ID: OTP-6359
STDLIB 1.14.2.1
修复的 Bug 和故障
已修复
erl_pp:exprs()
中的 Bug。自有 ID: OTP-6321 辅助 ID: seq10497
STDLIB 1.14.2
修复的 Bug 和故障
函数
io:format/2,3
和io_lib:format/2
的Format
参数的控制序列p
和P
对二进制数据的处理不太好。这个在 stdlib-1.14 中引入的 bug 已经被修复。自有 ID:OTP-6230
filelib:wildcard(Wc, PathWithRedundantSlashes)
,其中PathWithRedundantSlashes
是包含多余斜杠的目录路径,例如/tmp/
或//tmp
,可能会返回不正确的结果。(感谢 Martin Bjorklund。)自有 ID:OTP-6271
如果在模块声明之前使用预定义的宏 ?MODULE 或 ?MODULE_STRING,Erlang 代码预处理器会崩溃。这个 bug 已经被修复。
自有 ID:OTP-6277
改进和新特性
已经向
qlc
模块添加了对更快地连接两个表的支持。有两种快速连接:使用现有索引的查找连接和使用两个排序输入的归并连接。有一个新的join
选项,可以用来强制 QLC 在某些 QLC 表达式中使用特定类型的连接。还包括了其他一些更改
cursor/2
、eval/2
、fold/4
和info/2
的新tmpdir
选项可用于设置连接用于临时文件的目录。该选项还会覆盖keysort/3
和sort/2
的tmpdir
选项。新的
lookup
选项可用于断言在评估某些 QLC 表达式时会查找常量。cache
和cache_all
选项接受新的标签:ets
、list
和no
。标签list
使用临时文件将答案缓存在列表中(如果答案无法保存在 RAM 中)。结合使用{cache,list}
和{unique, true}
等同于调用选项unique
设置为true
的sort/2
。旧标签true
(等同于ets
)和false
(等同于no
)为了向后兼容而被识别。新的选项
max_list_size
可以用来设置归并连接开始对大型等价类使用临时文件以及将缓存在列表中的答案放入临时文件的限制。有一个新的回调函数
is_sorted_key
作为table/2
的选项提供。QLC 在尝试为查找函数查找常量时,会分析每个 QLC 表达式。到目前为止,只分析了只有一个生成器的 QLC 表达式。
请注意,只分析了紧跟在生成器之后带有保护语法的过滤器。对保护过滤器的限制是不兼容的更改。有关更多详细信息,请参阅
qlc
。以类似的方式,可以为单个 QLC 表达式的不同生成器使用几个用于遍历 QLC 表的匹配规范。
修复了一个 bug:当缓存对足够复杂的查询的答案时,可能会发生一些答案没有返回的情况。
* 潜在的不兼容性 *
自有 ID:OTP-6038
当代码深度嵌套时,Erlang 漂亮打印机 (
erl_pp
) 现在快得多。还修复了一些小 bug。自有 ID:OTP-6227 辅助 ID:OTP-5924
Erlang shell 现在尝试垃圾回收大型二进制文件。在某些情况下,这些二进制文件可能会无限期地存在。
自有 ID:OTP-6239
为了帮助 Dialyzer 找到更多 bug,Kernel 和 STDLIB 应用程序中的许多函数现在只接受文档中记录的类型的参数。
例如,函数
lists:prefix/2
和lists:suffix/2
文档说明只接受列表作为其参数,但实际上它们接受任何内容并返回false
。这种情况已经改变,如果一个或两个参数不是列表,这些函数会引发异常。此外,
string:strip/3
函数的文档说明需要一个字符参数,该字符将从字符串的一端或两端剥离。如果给定一个列表而不是字符,它过去什么都不做,但现在会引发异常。Dialyzer 将会找到大多数这些函数传递了错误类型参数的情况。
* 潜在的不兼容性 *
自有 ID:OTP-6295
STDLIB 1.14.1
修复的 Bug 和故障
调用
yecc:file/1,2
的函数c:y/1,2
现在由c:help/0
列出。c:y/1,2
的文档已添加到c
中。控制序列字符
s
识别二进制数据和深度字符列表这一事实已在io
中记录。此功能是在 R11B-0 (OTP-5403) 中添加的。自有 ID:OTP-6140
shell 命令 rr() 有时无法从文件中读取记录定义。此问题已修复。
自有 ID:OTP-6166 辅助 ID:OTP-5878
erl_eval
中的非局部函数处理程序(用于实现 Erlang shell 的限制模式)没有正确处理对erlang:apply/3
的调用。这个 bug 已经被修复。自有 ID:OTP-6169 辅助 ID:seq10374
当表不是命名表时,ets:rename/1 可能会死锁或崩溃 SMP 仿真器。
ets:next/2 和 ets:prev/2 可能会在 SMP 仿真器上返回错误的结果。
自有 ID:OTP-6198 辅助 ID:seq10392, seq10415
关闭 Dets 表时,有时会以无法在不修复文件的情况下打开表的方式保存空间管理数据。此 bug 已被修复。
自有 ID:OTP-6206
STDLIB 1.14
修复的 Bug 和故障
QLC 中的一个 bug 修复:用于实现 QLC 表的两个回调函数
TraverseFun
和LookupFun
现在允许返回一个列表以外的项。这样的项会立即作为当前查询的结果返回,并且主要用于返回错误元组。还修复了一些其他小 bug。
自有 ID:OTP-5195
STDLIB 模块
error_logger_file_h
和error_logger_tty_h
现在从 SASL 应用程序读取环境变量utc_log
。自有 ID:OTP-5535
ets:info/1
已更正为按照文档的行为并返回元组列表,而不是带有元组的元组。* 潜在的不兼容性 *
自有 ID:OTP-5639
从现在开始,在某些记录声明的默认值中引用到目前为止未声明的记录会被 linter 视为错误。如果记录声明的默认值使用或绑定变量,这也是一个错误。
* 潜在的不兼容性 *
自有 ID:OTP-5878
当使用
-include_lib
包含文件.hrl
文件时,包含路径会临时更新以包含找到.hrl
文件的目录,这将允许.hrl
文件本身使用-include
从其自身相同的目录中包含文件。(感谢 Richard Carlsson。)自有 ID:OTP-5944
更正了
filelib:ensure_dir/1
,它有时返回true
有时返回ok
,改为在成功时始终返回ok
。这与文档中说的true
相反,但ok
被认为是更符合逻辑的返回值。* 潜在的不兼容性 *
自有 ID:OTP-5960 辅助 ID:seq10240
当在
{Module, Function}(ArgList)
形式的调用中使用记录时,shell 现在可以更好地处理记录。自有 ID:OTP-5990 辅助 ID:OTP-5876
函数
lists:ukeysort/2
和lists:ukeymerge/3
已更改为,如果它们的键匹配,则认为两个元组相等。为了保持一致性,
lists:usort/2
和lists:umerge/3
也进行了修改:如果两个元素比较相等,则认为它们相等。file_sorter
模块已以类似的方式修改:unique
选项现在适用于键(keysort()
和keymerge()
)和排序函数(选项{order, Order}
)。* 潜在的不兼容性 *
自有 ID:OTP-6019
更正了
ets:update_counter/3
的文档;如果要更新的计数器是键,也会出现badarg
失败。自有 ID:OTP-6072
当使用
file_sorter
模块和排序函数对项进行排序时,排序并不总是稳定的。此 bug 已被修复。自有 ID:OTP-6088
改进和新特性
linter 的改进
- 在函数定义之后识别
compile
属性。 - 新的编译器选项
nowarn_deprecated_function
可用于关闭对已弃用函数的调用的警告。 - 新的编译器选项
{nowarn_unused_function,[{Name,Arity}]}
用于关闭对提到的未使用本地函数的警告。新的选项{nowarn_deprecated_function,[{Module,Name,Arity}]}
和{nowarn_bif_clash,[{Name,Arity}]}
的工作方式类似。
Erlang 代码预处理器
epp
现在可以识别file
属性。此属性旨在供 Yecc 等生成源代码文件的工具使用。自有 ID:OTP-5362
- 在函数定义之后识别
io:fwrite
和io_lib:fwrite
的格式化选项~s
已扩展为处理二进制数据或 I/O 列表的参数。自身 ID: OTP-5403
函数
io:format/2,3
和io_lib:format/2
的Format
参数中的控制序列p
和P
已更改为将包含可打印字符的二进制数据的内容显示为字符串。自身 ID: OTP-5485
当在
export
属性中多次导出函数时,linter 会发出警告。自身 ID: OTP-5494
添加了 STDLIB 的手册,
stdlib(6)
。它提到了 Erlang shell 的配置参数。自身 ID: OTP-5530
添加了
zip
模块,其中包含用于读取和创建 zip 归档文件的函数。请参阅zip
。自身 ID: OTP-5786
简单的一对一 supervisor 现在使用
dict
而不是列表来存储子进程的 pid。当有许多动态监控的子进程时,这会显著提高性能。(感谢 Mickaël Rémond 等人。)自身 ID: OTP-5898
当给定新的选项 '
strict_record_tests
' 时,编译器将生成代码来验证 guards 中 'R#record.field
' 操作的记录类型。自 R10B 以来,已经生成了验证 body 中记录类型的代码,但在此版本中,如果记录验证测试失败,将会出现 '{badrecord,RecordTag}
' 而不是 'badmatch
'。有关更多信息,请参阅compile
模块的文档。Erlang shell 始终应用严格的记录测试。
自身 ID: OTP-5915 辅助 ID: OTP-5714
Erlang 代码美化器 (
erl_pp
) 现在尝试在适当的位置插入换行符。自身 ID: OTP-5924
已从
digraph:new/1
中删除public
选项。原因是digraph
模块中的几个函数是使用多个 ETS 访问来实现的,这并非线程安全的。(感谢 Ulf Wiger。)* 潜在的不兼容性 *
自身 ID: OTP-5985
函数
lists:keyreplace/4
检查第四个参数 (NewTuple
) 是否为元组。自身 ID: OTP-6023
在
beam_lib
中添加了一个关于如何从调试信息(抽象代码)重建源代码的示例。(感谢编写此示例的 Mats Cronqvist。)自身 ID: OTP-6073
新的编译器选项
warn_unused_record
用于查找未使用的本地定义的记录类型。自身 ID: OTP-6105
STDLIB 1.13.12
已修复的错误和故障
已添加
shell_default:xm/1
。它调用xref:m/1
。自身 ID: OTP-5405 辅助 ID: OTP-4101
每当从记录声明的某些默认值引用到目前为止未声明的记录时,都会输出警告。在 STDLIB 1.14 (R11B) 中,此类前向引用将导致编译错误。
自有 ID:OTP-5878
linter 对
deprecated
属性的检查未考虑编译选项export_all
。此错误已修复。自身 ID: OTP-5917
Erlang 代码美化器未能正确处理
try/catch
。此错误已修复。自身 ID: OTP-5926
更正了
lists:nthtail/3
的文档。添加了
lists:keymap/3
的文档。尝试澄清
lists
中的一些其他类型声明和函数描述。更正了
timer:now_diff/2
的文档。修复了
gen_fsm
、gen_server
、io_lib
和lib(3)
中的断开链接。自身 ID: OTP-5931
已将类型检查添加到
lists.erl
中的函数。自身 ID: OTP-5939
改进和新功能
新的 STDLIB 模块
erl_expand_records
展开抽象代码中的记录。它被 Erlang shell 使用,这意味着 shell 不再使用 Compiler。自身 ID: OTP-5876 辅助 ID: OTP-5435
编译器现在会警告
megaco:format_versions/1
函数已弃用。自身 ID: OTP-5976
STDLIB 1.13.11
已修复的错误和故障
当使用注册的服务器名称调用
gen_server:enter_loop
时,仅检查了注册的名称是否存在,而没有检查它实际上是否是调用进程的名称。自身 ID: OTP-5854
改进和新功能
关于文档中
beam_lib:version/1
的更多详细信息。自身 ID: OTP-5789
新函数
io:read/3
的工作方式类似于io:read/1,2
,但接受第三个参数StartLine
。自身 ID: OTP-5813
添加了新函数
gen_fsm:enter_loop/4,5,6
,类似于gen_server:enter_loop/3,4,5
。自身 ID: OTP-5846 辅助 ID: seq10163
函数
c:i/1
现在已导出。自身 ID: OTP-5848 辅助 ID: seq10164
STDLIB 1.13.10
已修复的错误和故障
已修复
sofs
中的几个类型错误。自身 ID: OTP-5739
预处理器过去会抱怨宏定义 '
-define(S(S), ??S).
' 是循环的,但它不是。(感谢 Richard Carlsson。)自身 ID: OTP-5777
STDLIB 1.13.9
已修复的错误和故障
linter、QLC 和模块
erl_pp
未在所有情况下处理新的 'fun M:F/A
' 构造。此问题已修复。自身 ID: OTP-5644
改进和新功能
已更新大多数 Kernel 模块和一些 STDLIB 模块的手册页面,特别是关于类型定义。
更正了
erts:info/1
的返回值的文档。erlang:statistics/1
的文档现在列出了所有可能的参数。自身 ID: OTP-5360
用新的
fun M:F/A
构造替换了一些元组 fun。列表模块中的高阶函数在任何情况下都不再接受错误的 fun。'
lists:map(bad_fun, [])
' 过去返回 '[]
',但现在会导致异常。删除了
ets
模块中未使用的、已损坏的兼容性代码。(感谢 Dialyzer。)在 Appmon 应用程序中消除了 Dialyzer 发现的 5 个差异。
自身 ID: OTP-5633
如果系统中存在 100 多个进程,则
c:i/0
函数现在将以分页模式运行。(感谢 Ulf Wiger。)erlang:system_info(process_count)
已优化,现在返回的值与length(processes())
完全相同。之前,erlang:system_info(process_count)
不包括length(processes())
中包含的正在退出的进程。用于
erl
的+P
标志用于设置允许同时存在的最大进程数,不再接受高于 134217727 的值。(您可能仍然会在达到该限制之前耗尽内存。)自身 ID: OTP-5645 辅助 ID: seq9984
STDLIB 1.13.8
已修复的错误和故障
beam_lib
及其文档中的非常小的更正。自身 ID: OTP-5589
改进和新功能
erlang:port_info/1
BIF 现在已记录。对erlang:port_info/2
的文档进行了较小的更正。在
math
模块的文档中添加了一条注释,说明并非所有平台都提供所有函数。在 ERTS 文档的
erl
手册页中添加了有关 '+c
' 选项的更多信息。自身 ID: OTP-5555
新的
fun M:F/A
构造创建一个引用M:F/A
最新版本的 fun。此语法旨在替换存在许多问题的元组 fun{M,F}
。新的类型测试
is_function(Fun,A)
(可在 guards 中使用) 测试Fun
是否是可以应用于A
参数的 fun。(目前,Fun
也可以是元组 fun。)自身 ID: OTP-5584
STDLIB 1.13.7
修复的 Bug 和故障
filelib:wildcard/2
存在错误(它忽略了第二个参数)。此外,
filelib:wildcard("Filename")
(其中参数不包含任何元字符)总是会返回["Filename"]
。已修正为如果"Filename"
实际上不存在,则返回一个空列表。(在filelib:wildcard/2
中也做了相同的修正。)(此更改略有不兼容。)当给定诸如
"{a,"
之类的错误模式时,filelib:wildcard/1,2
将会生成不同的异常。以前的异常是由 'exit(missing_delimiter)
' 引起的,现在是 'erlang:error({badpattern,missing_delimiter})
'。内部 ID: OTP-5523 辅助 ID: seq9824
改进和新功能
加密调试信息的进一步改进:编译器的新选项
encrypt_debug_info
。内部 ID: OTP-5541 辅助 ID: seq9837
STDLIB 1.13.6
修复的 Bug 和故障
当以只读方式打开 Dets 表时,有时会尝试重新哈希表,从而导致错误消息。此问题已修复。
内部 ID: OTP-5487 辅助 ID: OTP-4989
改进和新功能
现在可以加密 Beam 文件中的调试信息,以帮助保持源代码的机密性。请参阅
compile
的文档,了解如何提供加密密钥,并参阅beam_lib
的文档,了解如何提供解密密钥,以便可以使用调试器、Xref 或 Cover 等工具。beam_lib:chunks/2
函数现在接受一个额外的 chunk 类型compile_info
,以直接检索编译信息作为 term。(感谢 Tobias Lindahl。)内部 ID: OTP-5460 辅助 ID: seq9787
STDLIB 1.13.5
修复的 Bug 和故障
如果文件无法写入,则关闭保存在 RAM 中的 Dets 表会导致崩溃。此问题已通过返回错误元组来修复。
内部 ID: OTP-5402
erl_pp
现在可以正确地漂亮打印fun F/A
。内部 ID: OTP-5412
如果编译器不在代码路径中,Erlang shell 将会失败。此问题已修复,但是为了评估记录,仍然需要编译器。
内部 ID: OTP-5435
更正了
ets:match/2
文档中的示例。 还澄清了ets:update_counter/3
以原子方式更新计数器。(感谢 Anders Svensson。)内部 ID: OTP-5452 辅助 ID: seq9770, seq9789
改进和新功能
为了向后兼容 STDLIB 1.13.1,重新引入了与系统其余部分并行启动 Erlang shell 的可能性。用于此目的的标志现在称为
async_shell_start
,并且已记录在文档中。从 JCL 菜单启动的新 shell 不再与init
同步。这使得即使初始 shell 没有启动,也可以启动新的 shell(例如,用于调试目的)。内部 ID: OTP-5406 辅助 ID: OTP-5218
当使用
snmp
模块中已弃用的函数时,编译器现在会生成警告。内部 ID: OTP-5425
函数
c:zi/0
已被删除。请改用c:i/0
。内部 ID: OTP-5432
修正了 Dialyzer 发现的两个小错误:从受限 shell 调用参数化模块(即,如果使用了
shell:start_restricted/1
)会导致 shell 计算器崩溃。gen_fsm
中的调试打印输出中有一个永远不会匹配的子句;导致打印的信息减少。以及 Dialyzer 发现的略微更严重的一个错误:
rpc:yield/1
会崩溃,除非rpc:async_call/4
启动的调用已经完成;rpc:nb_yield(Key,infinity)
也会崩溃。清理并删除了 Dialyzer 在
erlang:dmonitor_p/2
中发现的冗余代码。内部 ID: OTP-5462
STDLIB 1.13.4
修复的 Bug 和故障
Erlang shell 中的错误已修复。
内部 ID: OTP-5327
一些 Dialyzer 报告的死代码已被消除。
当跟踪到包装跟踪文件时,
dbg
中的一个错误已得到纠正。当开始新的包装跟踪时,它未能删除任何具有相同名称的已存在的包装跟踪文件。内部 ID: OTP-5329
linter 可能会输出有关记录初始化中位模式的无效警告。此问题已修复。
内部 ID: OTP-5338
ordsets:is_set(NoList)
,其中NoList
是除列表之外的任何 term,将会崩溃。 为了与sets:is_set/1
和gb_sets:is_set/1
保持一致,它现在返回false
。内部 ID: OTP-5341
已添加 BIF
erlang:raise/3
。 有关详细信息,请参阅手册。 它仅用于内部系统编程、高级错误处理。内部 ID: OTP-5376 辅助 ID: OTP-5257
改进和新功能
linter 现在会检查
deprecated
属性。 有关deprecated
属性的描述,请参阅xref
。内部 ID: OTP-5276
如果用户谓词的返回值形式不正确,则受限 shell 现在会指示。
内部 ID: OTP-5335
STDLIB 1.13.3
修复的 Bug 和故障
linter 中已修复有关未使用和阴影变量的错误。
内部 ID: OTP-5091
修复了评估器中的一个错误,该错误导致 shell 在位语法表达式中窒息。
内部 ID: OTP-5237
对于格式字符“g”的某些精度和值组合,
io:format/2
等不再崩溃。 以前,如果精度 P 为 4 或更低,并且要打印的浮点数的绝对值小于 10^4 但大于等于 10^(P-1) ,则会崩溃。 现在它不会因浮点数的值而崩溃。内部 ID: OTP-5263
Erlang shell 中已修复了位语法处理中的错误。
内部 ID: OTP-5269
gb_sets:del_element/2
已更改为与gb_sets:delete_any/2
执行相同的操作,这才是最初的意图,而不是与gb_sets:delete/2
执行相同的操作。依赖于gb_sets:del_element/2
在元素不存在时导致错误的 代码必须更改为调用gb_sets:delete/2
。文档也已更新,以明确记录仅被称为已记录函数的“别名”的函数。此外,还添加了
gb_sets
、sets
和ordsets
共有的所有函数的列表。* 潜在的不兼容性 *
内部 ID: OTP-5277
调试消息已从 QLC 模块中删除。
内部 ID: OTP-5283
改进和新功能
已减少从
dets:match/1,3
、dets:match_object/1,3
和dets:select/1,3
返回的延续的大小。 这会影响 Mnesia 在评估 QLC 查询时在节点之间发送的数据量。内部 ID: OTP-5232
STDLIB 1.13.2
改进和新功能
用于启动远程 shell 的
-rsh
开关(在 OTP-5210 中引入)与slave
使用的现有开关冲突。因此,远程 shell 的开关现在改为命名为-remsh
。内部 ID: OTP-5248 辅助 ID: OTP-5210
STDLIB 1.13.1
修复的 Bug 和故障
Pman “跟踪 shell”功能已损坏,现已修复。此外,如果节点上运行多个 shell 进程,Pman 无法正确找到活动 shell 的 pid。 此问题也已纠正。
内部 ID: OTP-5191
当使用未记录的功能“参数化模块”时,?MODULE 宏无法正常工作。
内部 ID: OTP-5224
改进和新功能
现在可以使用
-rsh
标志启动 Erlang,它会为您提供一个远程初始 shell 而不是本地 shell。 例子erl -sname this_node -rsh other_node@other_host
内部 ID: OTP-5210
lists
模块的手册页已更新,其中包含对新的zip
、unzip
和partition/2
函数的描述。内部 ID: OTP-5213
在 JCL 模式下,顶级组领导者过去被列为作业列表中的作业 #1。由于此进程没有可以连接的 shell,因此将不再列出。
自身 ID:OTP-5214
为了向后兼容,重新引入了与系统其余部分并行启动 Erlang shell 的可能性。请注意,这种旧的行为容易出错,除非出于某种原因有必要,否则不应使用。
自身 ID:OTP-5218 辅助 ID:seq9534
现在,当从 BEAM 文件读取记录定义时,
shell
命令rr/1,2,3
接受通配符。自身 ID:OTP-5226