查看源代码 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 的此语法。

    内部 ID:OTP-19322 辅助 ID:GH-8963PR-8987

  • 修复了完成 'fun(' 会导致 shell 崩溃的错误。

    内部 ID:OTP-19351 辅助 ID:PR-9043

  • 修复了 shell 在尝试完成以 '/' 开头的表达式或后跟 '(' 或 '/' 的变量时崩溃的错误。例如:Foo/ 和 Foo(。

    内部 ID:OTP-19361 辅助 ID:PR-9078

  • zip:extract/2 使用 keep_old_files 现在会遵守 cwd 选项。

    内部 ID:OTP-19370 辅助 ID:PR-9097GH-9087

  • 修复了 uri_string:percent_decode 规范中的错误

    内部 ID:OTP-19380 辅助 ID:GH-8755

改进和新功能

STDLIB 6.1.2

已修复的 Bug 和故障

  • 通过此更改,当 URI 映射中未提供路径时,uri_string:normalize 假定为空路径(不会崩溃)。

    内部 ID:OTP-19266 辅助 ID:ERIERL-1127,PR-8890

  • 修复了 json:format/3 的规范。

    内部 ID:OTP-19286 辅助 ID:GH-8880PR-8914

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 修饰符。

    内部 ID:OTP-19146 辅助 ID:PR-8611GH-8568

  • 修复了当关键字和元组出现在同一行时导致 shell 完成崩溃的错误。

    内部 ID:OTP-19157 辅助 ID:PR-8638

  • 由于 PR-7419/OTP-18671,callback_mode 的缓存内部值开始泄漏到 logger 报告中,这可能导致 logger 处理程序崩溃。现在已修复此问题,可以像缓存之前一样显示设置的值。

    内部 ID:OTP-19164 辅助 ID:GH-8605PR-7419,OTP-18671

  • 修复了与压缩 ETS 表相关的模拟器崩溃。

    内部 ID:OTP-19176 辅助 ID:PR-8683

  • 当找不到键时,maps:update/3 的错误描述将不再坚持认为第三个参数不是映射

    内部 ID:OTP-19189

  • 在为 shell 创建文档的 markdown 解析器中,已纠正了多个问题。

    解析器错误地解析了括号内的格式化 markdown(粗体或斜体)。这过去在 shell 文档 (_Option._) 中显示不正确,以原文显示。此修复使 Option. 以斜体显示。

    markdown 解析器还用于创建其他文档格式,因此这是一个影响其他生成文档格式的错误。

    内部 ID:OTP-19200 辅助 ID:GH-8738PR-8739

  • 修复了 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 的进度报告将在调试级别记录。

    潜在的不兼容性

    内部 ID:OTP-19202 辅助 ID:PR-8261GH-8715PR-8741

  • 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 和故障

STDLIB 6.0

修复的 Bug 和故障

  • 模块 binary 中的规范已更新,以反映文档允许的内容。

    自有 ID:OTP-18684 辅助 ID:PR-7481

  • binary 模块中的几个函数在某些情况下会接受错误类型的参数。在此版本中,当给定不正确的类型时,它们现在会引发异常。

    如果主题二进制文件为空或给定了 {scope,{0,0}} 选项,则以下函数将接受无效的模式: binary:match/2,3binary:matches/2,3binary:replace/3,4binary:split/2,3

    调用 binary:copy(<<1:1>>, 0) 会返回一个空二进制文件,而不是引发异常。类似地,调用 binary:part/2,3 尝试在位串的 0 位置提取 0 个字节将返回一个空二进制文件,而不是引发异常。

    自有 ID:OTP-18743 辅助 ID:PR-7607PR-7628

  • 预处理器的文档现在提到,可以在 -if-elif 指令的条件中调用 defined(Name),以测试 Name 是否是已定义宏的名称。(此功能在 OTP 21 中实现。)

    如果在 -if-elif 中调用的函数名称不是守卫 BIF 的名称,则不会出现编译错误,而是会导致跳过指令后面的行。现在已将其更改为编译错误。

    潜在的不兼容性

    自有 ID:OTP-18784 辅助 ID:GH-7706PR-7726

  • 使用 I/O 协议的 get_until 请求现在在 eof 是回调返回的最后一个项目时,正确返回二进制文件或列表。

    自有 ID:OTP-18930 辅助 ID:PR-7993GH-4992

  • simple_one_for_one 监控器的错误处理已得到增强。返回 ignore 的瞬态子进程将不再导致崩溃。

    此外,自动关闭已被禁用,因为它对于这种监控器类型没有意义。允许这样做被认为是错误。因此,我们不认为这是一个不兼容的更改。

    潜在的不兼容性

    自有 ID:OTP-19029 辅助 ID:PR-8230

  • 修复了 shell 扩展,使其在扩展具有非原子键的映射时不会崩溃,并且在给定参数时不会列出零元函数。

    自有 ID:OTP-19073 辅助 ID:PR-8375GH-8366GH-8365GH-8364

改进和新功能

  • 函数 is_equal/2map/2filtermap/2 已添加到模块 setsordsetsgb_sets

    自有 ID:OTP-18622 辅助 ID:PR-7183PR-7232

  • 编译器现在为函数头不匹配发出更友好的错误消息。例如,给定

    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

    潜在的不兼容性

    自有 ID:OTP-18750 辅助 ID:OTP-18746、PR-7313PR-7451

  • 新函数 proc_lib:set_label/1 可用于向任何没有注册名称的进程添加描述性术语。该名称将由诸如 c:i/0observer 之类的工具显示,并且将包含在使用 gen_servergen_statemgen_eventgen_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

    自有 ID:OTP-18789 辅助 ID:PR-7720PR-8003

  • -callback 属性已添加到模块 syserl_error

    自有 ID:OTP-18793 辅助 ID:PR-7703

  • 已将多个接受 fun 的新函数添加到模块 timer

    函数 apply_after/2apply_interval/2apply_repeatedly/2 接受一个空 fun 作为第二个参数,而函数 apply_after/3apply_interval/3apply_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/1shell:inverted_space_prompt/1shell:prompt_width/1 以帮助实现自定义提示符。

    自有 ID:OTP-18834 辅助 ID:PR-7675PR-7816

  • 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_treesgb_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。当文档属性将类型标记为隐藏时,它们将不会成为文档的一部分。

    • 默认情况下,来自 moduledocdoc 的文档会按照 EEP-48 的格式添加到二进制 beam 文件中。

    • 使用编译器标志 warn_missing_doc 将在导出的函数、类型和回调中缺少 -doc 属性时引发警告。

    • 使用编译器标志 warn_missing_spec_documented 将在已记录的函数、类型和回调中缺少 spec 属性时引发警告。

    • moduledocdoc 可以引用要嵌入的外部文件,例如 -doc {file, "README.md"}.,它引用当前工作目录下的 README.md 文件。

    • 当导出的函数的 spec 引用隐藏类型时,编译器会发出警告。因此,当导出的函数中使用隐藏类型(意味着该类型不是文档的一部分)时,将会出现警告。

    自身 ID: OTP-18916 辅助 ID: PR-7936

  • 新增 ets 函数 ets:first_lookup/1ets:next_lookup/2ets:prev_lookup/2ets: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:foldlets:foldr 以使用新的 ets:next_lookup。还使其免受表重命名的影响。

    自身 ID: OTP-18993 辅助 ID: PR-8048

  • Windows 现在支持 math 中的所有函数。

    自身 ID: OTP-19001 辅助 ID: PR-8164

  • erl_lint (以及扩展的 compiler) 现在会警告使用已弃用的回调的代码。

    当前唯一已弃用的回调是 gen_servergen_eventgen_statem 中的 format_status/2

    可以使用 nowarn_deprecated_callback 来消除警告。

    自身 ID: OTP-19010 辅助 ID: PR-8205

  • 有一个新的模块 json 用于编码和解码 JSON

    编码和解码都可以自定义。解码可以以类似 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 作业控制模式在输入 TABCTRL+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,2sys: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_iostandard_erroruser I/O 设备的文档。

    添加了类型 io:standard_io/0io:standard:error/0io:user/0

    自身 ID: OTP-18676 辅助 ID: PR-7473 GH-7459

  • 修复了 h/2,3 以正确渲染多子句文档。

    自身 ID: OTP-18683 辅助 ID: PR-7502

  • timer:apply_after/4apply_interval/4apply_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,2init_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_argsdetached

    自身 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/4timer: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/2max/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/1maps:next/1 返回的顺序。新顺序是不可预测的,并且可能在 Erlang VM 的不同调用之间发生变化。

    对于顺序很重要的应用程序,有一个新的函数 maps:iterator/2 用于创建以确定性顺序返回 Map 元素的迭代器。此外,io:format() 的格式字符串还添加了新的修饰符 kK,以支持按顺序打印 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/3gen_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/0current_stacktrace/0current_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/1list_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_groupglobal 中各种其他不一致性错误和死锁。

    作为这些修复的构建块,引入了新的 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_statemgen_servergen_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/0supervisor: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_servergen_statemgen_eventformat_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/2rfc3339_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 请求,在 erpcgen_servergen_statemgen_event 中引入了利用请求标识符集合的新功能。

    内部ID: OTP-17784 辅助ID: PR-5792

  • 更新到 Unicode 14.0 规范。

    内部ID: OTP-17869 辅助ID: PR-5595

  • 以下 ets 类型已重命名为更清晰的名称:tab/0 重命名为 table/0comp_match_spec/0 重命名为 compiled_match_spec/0

    类型 table_access/0table_type/0 已导出。

    内部ID: OTP-17901 辅助ID: GH-4968 PR-5649

  • 添加对将 .asn1 文件定位到 filelib:find_file/1filelib:find_source/1 的默认搜索规则的支持。

    内部ID: OTP-17908 辅助ID: GH-5655 PR-5669

  • 类型规范已添加到 gen_server,并且文档已更新以利用此规范。

    这暴露出一些类型违规,这些违规已在 globallogger_olprpc 中得到纠正。

    内部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/2groups_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/1uniq/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/3shell_docs:get_callback_doc/3shell_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_specexport_all 时,只会为使用 -export 属性显式导出的函数缺少规范发出警告。

    内部ID: OTP-17434 辅助ID: GH-4772

  • 使用内容为文件名称(而不是目录)的原子调用 c:ls/1 将会导致崩溃。

    内部ID: OTP-17463 辅助ID: GH-4916

  • 即使尚未看到任何 -module() 声明,MODULEMODULE_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:formatio:fwriteio:put_charsio:nlio:write

    内部 ID: OTP-17317 辅助 ID: PR-4757

  • EEP-54 (提供更多关于错误的信息) 现在为 format_error 回调包括了两个新的返回值,generalreason

    format_error 回调返回的多行错误描述现在可以正确缩进。

    Erlang 参考手册中关于 erl_errorerror/3错误和错误处理 的文档已扩展。

    内部 ID: OTP-17454 辅助 ID: PR-4764

  • lists 模块的文档中,已明确说明谓词函数必须返回布尔值。

    内部 ID: OTP-17503 辅助 ID: GH-4985

  • 关于 c:c/1c:c/2c:c/3 的文档已进行澄清。

    内部 ID: OTP-17571 辅助 ID: GH-5103

STDLIB 3.15.2

修复的错误和故障

  • 修复了在使用控制序列 pP 格式化元组,并使用 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/1filename: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_docserl_docgenem 标签解释为 strong 的错误。

    内部 ID: OTP-17122

  • 在 Solaris 上,math:acos/1math: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/1rand:bytes_s/2 实现了生成伪随机二进制文件。

    内部 ID: OTP-14646 辅助 ID: PR-2920

  • 已将新函数添加到 proplists 模块:to_map/1,2from_map/1

    内部 ID: OTP-14647 辅助 ID: PR-2910

  • 已将新函数添加到 queue 模块:all/2any/2delete/2delete_r/2delete_with/2delete_with_r/2

    内部 ID: OTP-14650 辅助 ID: PR-2850

  • 已将新函数添加到 queue 模块:fold/2filtermap/2

    内部 ID: OTP-14793 辅助 ID: PR-2791

  • 已删除对在 OTP R15 之前创建的抽象代码的处理支持。

    内部 ID: OTP-16678 辅助 ID: PR-2627

  • 已实现 EEP 54 中提出的针对失败的 BIF 调用的扩展错误信息。

    当 Erlang shell 中的 BIF 调用失败时,将打印更多关于哪个或哪些参数出错的信息。当 BIF 调用失败时,proc_libcommon_testqlc 也将使用相同的扩展错误信息。

    对于希望提供相同扩展错误信息的应用程序,有新函数 erl_error:format_exception/3erl_error:format_exception/4

    有一个新的 error/3 BIF,允许应用程序或库以相同的方式为自己的异常提供扩展的错误信息。

    内部 ID: OTP-16686

  • 引入了 进程别名 功能,如 EEP 53 中所述。引入此功能是为了提供一种轻量级机制,可以防止超时或连接丢失后的延迟回复。有关更多信息,请参见 EEP 53 以及新的 alias/1 BIF 和 monitor/3 BIF 的新选项的文档。

    已更新 gen_servergen_statemgen_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/3intersect/2intersect_with/3filtermap/2from_keys/2maps:foreach/2

    maps:merge_with/3merge/2 相同,但它接受一个额外的函数,用于组合具有相同键的项目。

    maps:intersect/2 计算两个映射的交集。

    maps:intersect_with/3intersect/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/1maps:keys/1maps:values/1 不会让步。这可能会导致进程调度不公平。

    自有 ID: OTP-17057

  • sets 模块现在有一个可选的基于映射的实现,如 EEP 50 中所述。

    要使用此实现,请将 {version,2} 选项传递给 sets:new/1sets:from_list/2

    自有 ID: OTP-17059 辅助 ID: PR-2864

  • 添加了 shell_docs:supported_tags/0。此函数可用于检索 shell_docs 当前支持的标签。

    自有 ID: OTP-17120

  • shell_docs 使用的 application/erlang+html 文档存储格式已更新,以包含标签 bstrongh4h5h6

    自有 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

  • ioio_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

  • 类型为 setbagduplicate_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

修复的错误和故障

  • 修复了在使用控制序列 pP 格式化元组,并使用 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/2digraph: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) + 1lists: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_libgen_servergen_eventgen_statemgen_fsmsupervisorsupervisor_bridgeapplication

    改进了 proc_lib 中以及格式化异常时 chars_limitdepth 的处理。

    自有 ID: OTP-15299

  • 删除 I/O 协议旧请求的使用和文档。

    自有 ID: OTP-15695

  • 提高了更改表大小的并发调用的 ETS 可扩展性,例如 ets:insert/2ets:delete/2

    此性能特性已在 OTP 22.0 中为 ordered_set 实现,现在适用于所有 ETS 表类型。

    改进的可扩展性可能会以 ets:info(T,size)ets:info(T,memory) 的更长延迟为代价。因此,添加了一个新的表选项 decentralized_counters。对于启用 write_concurrencyordered_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_libgen_servergen_statemgen_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

  • indentlinewidth 添加到 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

修复的错误和故障

  • 修复了在使用控制序列 pP 格式化元组,并使用 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_modulepush_callback_modulepop_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/2create/2,3add/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:logsys: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 的 ETS ordered_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

修复的错误和故障

  • 修复了使用控制序列 pP 并使用 chars_limit 选项限制输出时,格式化术语可能导致循环的错误。

    自有 ID:OTP-15875 辅助 ID:ERL-967

STDLIB 3.9.1

修复的错误和故障

  • 修复了使用控制序列 pP 并使用 chars_limit 选项限制输出时,格式化二进制文件可能导致失败的错误。

    自有 ID:OTP-15847 辅助 ID:ERL-957

STDLIB 3.9

修复的错误和故障

  • 修复了 string:lexemes/2 中的错误。

    在优化 string 模块中对 Unicode 字符的深层列表的处理时发现了该错误。

    自有 ID:OTP-15649

  • 修复了 maps 实现中的一个错误,该错误可能导致崩溃或内存使用量增长,直到机器耗尽内存。当将一个包含二进制文件 B1 的新键值对,键为 K1 插入到具有一个包含二进制文件 B2 的键 K2 的 map M 中时,如果满足以下条件,则可能会发生这种情况

    • B1 =/= B2
    • size(B1) >= 4294967296
    • size(B2) >= 4294967296
    • size(M) >= 32
    • (size(B1) rem 4294967296) == (size(B2) rem 4294967296)
    • B1B2 中,前 (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/0server_ref/0start_opt/0start_ret/0enter_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/2erase/1 现在会产生结果。

    自有 ID:OTP-15615

  • 以前,所有 ETS 表都使用集中式计数器变量来跟踪存储的项目数量和消耗的内存量。这些计数器可能会导致可伸缩性问题(尤其是在大型 NUMA 系统上)。此更改添加了分布式计数器的实现,并修改了 ETS 的实现,以便启用了 write_concurrencyordered_set 类型的 ETS 表使用分布式计数器。实验表明,在频繁调用 ets:insert/2ets:delete/2 的场景中,此更改显着提高了启用了 write_concurrency 的 ETS ordered_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

修复的错误和故障

  • 修复了使用控制序列 pP 并使用 chars_limit 选项限制输出时,格式化术语可能导致循环的错误。

    自有 ID:OTP-15875 辅助 ID:ERL-967

STDLIB 3.8.2.1

修复的错误和故障

  • 修复了使用控制序列 pP 并使用 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

  • 修复了使用控制序列 pP 格式化字符列表并使用选项 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

  • 即使格式化函数在模块 ioio_lib 中的 Format 参数是二进制列表等类型,也会被接受。这与 Erlang/OTP 21.0 之前的行为一致。

    自有 ID: OTP-15304

STDLIB 3.5.1

修复的错误和故障

  • 修复了一个当使用控制序列 pP 格式化非字符列表并使用 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/0inet:posix/0 的类型规范。

    自有 ID: OTP-14019 辅助 ID: ERL-550

  • 文件操作过去接受包含空字符(整数值零)的文件名。这会导致名称被截断,并在某些情况下导致原始操作的参数被混淆。现在拒绝文件名中包含空字符的文件名,并会导致原始文件操作失败。

    此外,环境变量操作过去接受包含空字符(整数值零)的环境变量的名称。这会导致操作静默地产生错误的结果。现在拒绝名称或值中包含空字符的环境变量名称和值,并会导致环境变量操作失败。

    原始环境变量操作过去还接受环境变量名称中的 $= 字符,从而导致各种问题。现在也拒绝环境变量名称中的 $= 字符。

    此外,os:cmd/1 现在拒绝其 命令内的空字符。

    erlang:open_port/2 从现在开始也将拒绝端口名称内的空字符。

    * 潜在的不兼容性 *

    自有 ID: OTP-14543 辅助 ID: ERL-370

  • 使 io_lib:unscan_format/1 可以使用填充字符和默认精度。

    自有 ID: OTP-14958 辅助 ID: PR-1735

  • 控制序列修饰符 tl 可以在同一控制序列中一起使用,这使得可以同时拥有 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_loggersasl_errlog_type 指定这些事件的记录目标(终端或文件)和严重性级别。

    由于 Logger 是 Erlang/OTP 21.0 中的新功能,因此我们保留在此版本之后的补丁中对 Logger API 和功能进行更改的权利。这些更改可能与初始版本向后兼容,也可能不兼容。

    * 潜在的不兼容性 *

    自有 ID: OTP-13295

  • 添加函数 calendar:system_time_to_local_time/2calendar:system_time_to_universal_time/2

    自有 ID: OTP-13413

  • 添加了函数 rand:uniform_real/0rand: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 加载的默认行为:不再从当前目录加载 .erlangc:erlangrc(PathList) 可用于从用户指定的目录搜索和加载 .erlang 文件。

    escripterlcdialyzertyper 不再加载 .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/1decode/1mime_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,2calendar:system_time_to_rfc3339/1,2

    内部 ID:OTP-14764

  • erl_eval 模块的函数返回的堆栈跟踪更能准确地反映异常发生的位置。

    内部 ID:OTP-14826 辅助 ID:PR 1540

  • erl_tar:add/3,4 函数添加选项 atimemtimectimeuidgid

    内部 ID:OTP-14834 辅助 ID:PR 1608

  • 添加了 ets:whereis/1,用于检索命名表的表标识符。

    内部 ID:OTP-14884

  • 改进了 uri_string 模块中的 URI 规范化函数。

    内部 ID:OTP-14910

  • 新函数 io_lib:fwrite/3io_lib:format/3 接受第三个参数,一个选项列表。唯一的选项是 chars_limit,用于限制返回的字符数。该限制是软性的,这意味着返回的字符数最多只会略微超出限制。如果设置了限制,函数 format/3fwrite/3 将尝试在控制序列 pPswW 中均匀分布字符数。此外,控制序列 pPwP 将尝试在子结构中均匀分布字符数。

    控制序列 pPwW 的一个修改是,即使返回的字符数没有限制,也会将映射的所有关联打印到相同的深度。目的是在映射键的顺序未定义的情况下提供更一致的输出。和之前一样,如果深度小于映射的关联数,则要打印的关联的选择是任意的。

    内部 ID:OTP-14983

  • 添加函数 ordsets:is_empty/1sets:is_empty/1

    内部 ID:OTP-14996 辅助 ID:ERL-557, PR-1703

  • 改进了处理 ASCII 字符时 string:uppercase/1string:lowercase/1string: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

  • 在包含 pP 的函数 io:fwrite/2,3io_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/0try 块外部使用的错误警告。

    内部 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/1dbg:fun2ms/1 使用,计算常量算术表达式。这是必要的,因为 Erlang 编译器(通常计算常量表达式)不识别 ms_transform 生成的格式。

    内部 ID:OTP-14454 辅助 ID:ERIERL-29

  • 状态机引擎 gen_statem 现在可以处理通用超时(多个命名)以及绝对超时时间。请参阅文档。

    gen_statem 回调 Module:init/1 已成为强制性的,以便与其他 gen_* 模块保持一致。对于使用 gen_statem:enter_loop/4-6gen_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/0code:modified_modules/0 的缩写,lm/0 重新加载所有当前已加载的、在磁盘上已更改的模块。

    自有 ID: OTP-14059

  • assert.hrl 中的每个断言宏现在都有一个带有额外参数的对应版本,用于向断言添加注释。例如,这些可以作为错误报告的一部分打印,以阐明失败检查的含义。

    自有 ID: OTP-14066

  • 为了提高可读性,并且为了不更改消息末尾的行终止属性,error_logger_tty_herror_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 已添加到 dictorddictgb_treestake_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/1c/2 已被扩展,以便如果参数是模块名称而不是文件名,它会自动查找 .beam 文件和相应的源文件,然后使用相同的编译器选项(加上传递给 c/2 的任何选项)重新编译该模块。如果编译失败,则保留旧的 beam 文件。还添加了 c(Mod, Opts, Filter),其中 Filter 参数允许您在添加新选项之前删除旧的编译器选项。

    新的实用函数 file_find/2/3find_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/2normal_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_servergen_statemproc_lib 创建的崩溃报告的大小受 Kernel 应用程序变量 error_logger_format_depth 的限制。目的是限制当具有大量消息队列或状态的进程崩溃时发送到 error_logger 进程的消息的大小。

    proc_lib 生成的崩溃报告包括新的标签 message_queue_len。邻居报告还包括新的标签 current_stacktrace。最后,邻居报告不再包括标签 messagesdictionary

    可以使用新函数 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/1erl_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,2zip: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,3maps: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_scanerl_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,4maps: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_servergen_fsm 执行转换的限制。这使得用户定义的基于 gen 的通用回调模块可以在 c:i() 和观察器中很好地显示。

    自有 ID: OTP-13623

  • 函数 queue:lait/1liat/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_timestampstrict_monotonic_timestamp。这是因为已经存在的 timestamp 选项不是时间扭曲安全的。

    ets:info/2dets: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

改进和新功能

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" vs filename: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_concurrencywrite_concurrency 选项。

    自有 ID:OTP-12814

  • 在许多情况下,用户代码需要能够区分正常关闭的套接字和被中止的套接字。设置选项 {show_econnreset, true} 使使用者可以在活动和被动套接字上都接收到 ECONNRESET 错误。

    自有 ID:OTP-12841

改进和新特性

  • 允许使用 map 作为 supervisor 标志和子进程规范

    以前,supervisor 标志和子进程规范以元组的形式给出。虽然为了向后兼容性保留了这种形式,但现在也允许将这些参数作为 map 给出,请参阅 sup_flagschild_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/2unscan_format/1build_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 会以以下两种方式之一失败

    1. 如果 P < 项的打印长度,则会进入无限循环,消耗所有可用内存。

    2. 如果 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

改进和新特性

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,2sys:replace_state/2,3 已被修复,因此它们现在可以在进程被 sys 挂起时运行。为了实现这一点,添加了新的回调 Mod:system_get_state/1Mod:system_replace_state/2,这些回调也由通用行为 gen_servergen_eventgen_fsm 实现。

    潜在的不兼容性指的是

    • 不再支持拦截系统消息并将大小为 2 的元组作为最后一个参数传递给 sys:handle_system_msg/6 的先前行为。
    • sys:replace_state/2,3 中的 StateFun 失败时的错误处理从完全静默更改为可能会在客户端进程中抛出异常(如果回调模块没有捕获)。

    (感谢 James Fish 和 Steve Vinoski)

    * 潜在的不兼容性 *

    自身 ID: OTP-11817

改进和新特性

  • 向 re:run 添加了设置 match_limit 和 match_limit_recursion 的选项。还添加了选项 report_errors,以便在 re:run 由于限制或编译错误而失败时获得更多信息。

    自身 ID: OTP-10285

  • 预定义类型 array/0dict/0digraph/0gb_set/0gb_tree/0queue/0set/0tid/0 已被弃用。它们将在 Erlang/OTP 18.0 中移除。

    相反,可以使用 array:array/0dict:dict/0digraph:graph/0gb_set:set/0gb_tree:tree/0queue:queue/0sets:set/0ets:tid/0。(注意: 一直都需要使用 ets:tid/0。)

    在 Erlang/OTP 17.0 中允许本地重新定义类型 array/0dict/0 等。

    添加了新类型 array:array/1dict:dict/2gb_sets:set/1gb_trees:tree/2queue:queue/1sets: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/2check_process_code/3 BIF。这两个 BIF 都将选项列表作为最后一个参数。使用它们可以发出异步请求。

    code:purge/1code:soft_purge/1 已被重写,以利用异步 check_process_code 请求来并行化工作。

    特性影响:调用 garbage_collect/1 BIF 或 check_process_code/2 BIF 通常需要更长的时间才能完成,但系统整体不会像以前那样受到操作的负面影响。调用 code:purge/1code: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/0bitstring/0iodata/0boolean/0 类型时会发出警告。现在改为发出错误。

    * 潜在的不兼容性 *

    自身 ID:OTP-11771

  • erl_parse:abstract/2encoding 选项已扩展为包含 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/3dets:foldr/3dets: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/2match_object/2select/2match_delete/2select_delete/2

    自有 ID:OTP-10097

  • 已实现 Unicode 支持。

    自有 ID:OTP-10302

  • linter 现在会警告未导出的不透明类型,以及欠规范的不透明类型。

    自有 ID:OTP-10436

  • filename 模块中的以下函数中,类型 file:name() 已替换为类型 file:filename()absname/2absname_join/2join/1,2split/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_scansys 的约定和类型。(感谢 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/2erl_parse:abstract/2 接受编码作为第二个参数。

    自有 ID:OTP-10749 辅助 ID:OTP-10302

  • 增加了 ETS 中 write_concurrency 选项的潜在并发性。内部表锁的数量已从 16 增加到 64。这使得两个并发进程写入同一表而发生冲突并因此被序列化的可能性降低了四倍。代价是使用 write_concurrency 的表增加了恒定的内存占用。每个插入记录的内存消耗不受影响。如果 write_concurrencyread_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/1zip: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/3lists:keysearch/3lists: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/2tc/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/2match/1,3match_object/1,3select/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

  • 已防止 erlcdialyzertyperrun_testheartescripterlexec 中发生缓冲区溢出。

    (感谢 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=PATH configure 命令行参数,指定 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-compatibility configure 命令行参数。

    自有 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/2escript:extract/2

    已删除未记录的函数 escript:foldl/3。可以使用更灵活的函数 escript:extract/2zip: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_servergen_fsmgen_event 行为做出了一些澄清。 有关更多信息,请参阅 gen_servergen_fsmgen_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/5digraph: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/1base64: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,2set_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/2ordsets:is_disjoint/2gb_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_libgen_servergen_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/3tokens/4token_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/1string: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

  • 现在实验性地支持从存档文件加载代码。有关更多信息,请参阅 codeiniterl_prim_loaderescript 的文档。

    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,3io_lib:fwrite/2 的控制序列 pP 引入的每行非空白字符数的 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/2out/1 等进行了优化。请参阅文档。

    新函数:is_queue/1get/1get_r/1peek/1peek_r/1drop/1drop_r/1liat/1is_queue/1 是一个新的谓词,liat/1 是对旧拼写错误的修正,其他函数(get*、peek* 和 drop*)是新的接口函数。

    内部 ID: OTP-7064

  • 当涉及写入浮点数时,函数 io_lib:write/1,2io_lib:print/1,4 已更改。此更改会影响 io_lib 模块的控制序列 pPwW。(感谢 Bob Ippolito 的代码贡献。)

    内部 ID: OTP-7084

  • 更新了 erlang:function_exported/3io: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 接受一个新选项 depthqlc:table/2 的描述中使用的类型 SelectedObjects 已被扩充。

    内部 ID: OTP-7238

  • 文档中已将 tuple_size/1byte_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/1byte_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/1digraph_utils:is_arborescence/1digraph_utils:arborescence_root/1 是新增的。

    自有 ID:OTP-7081

  • 如果记录更新代码由多个源代码行组成,编译器可能会为记录更新生成次优代码。

    自有 ID:OTP-7101

STDLIB 1.15

已修复的错误和故障

  • qlc 中已修复错误。

    • qlc:table/2lookup_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) 调用进程必须链接到被调用服务器。

    1. 调用不能按名称远程,即它必须是按 pid 本地或远程、按名称本地或按名称全局。

    2. 调用进程必须设置 process_flag(trap_exit, true)

    3. 服务器必须在调用期间崩溃。

    4. 调用进程必须对在其消息队列中获取先前消耗的 {'EXIT',Pid,Reason} 消息敏感。

    旧的行为曾经是客户端注意到服务器是否死掉的唯一方法,但自从 erlang:monitor(process, {Name,Node}) 被引入并在 gen:call 中使用以来,如果不是错误,则被视为不希望的行为。

    受影响的用户 API 包括:gen_server:call/2,3gen_fsm:sync_send_event/2,3gen_fsm:sync_send_all_state_event/2,3gen_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,3io_lib:fwrite/2Format 参数的控制序列 P 现在在打印元组和列表时插入更少的分行符。引入了每行非空白字符数软上限 60。

    自有 ID:OTP-6708

  • 新模块 array 提供快速的函数式数组实现。

    自有 ID:OTP-6733

  • 长期以来已弃用的函数现已从以下模块中删除:dicterl_evalerl_ppioio_liblistsorddictordsetssetsstring

    未记录的函数 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/4keytake/3lists 模块中的新增函数。

    自有 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/1lists:keysort/2 以及浮点数和整数混合使用的 Bug。

    自有 ID: OTP-6606

  • 在 Erlang shell 中调用 erlang:garbage_collect/0 时,不仅会对求值器进程(通过在 Erlang shell 中调用 self/0 返回的进程)进行垃圾回收,还会对保存历史记录列表的进程进行垃圾回收。

    自有 ID: OTP-6659

  • beam_lib 模块中曾经捕获异常并返回元组 {'EXIT',Reason} 的函数现在会以 reason Reason 退出。

    自有 ID: OTP-6711

  • 现在,每当计算运算符时(异常是 andalsoorelsecatch),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/1beam_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/1beam_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,3io_lib:fwrite/2 函数的 Format 参数为二进制。

    自有 ID: OTP-6517

STDLIB 1.14.3.1

修复的 Bug 和故障

  • 当应用于二进制时,io:fwrite/2,3io_lib:fwrite/2 函数的 Format 参数的控制序列 pP 可能会导致 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_fsmgen_serverproc_lib startstart_link 函数的行为已从无限期挂起更改为以原因 badarg 失败。

    (感谢 Fredrik Linder)

    自有 ID: OTP-6345

改进和新特性

  • 现在,当达到最大深度时,io:fwrite/2,3io_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,3dets:match/1,3dets: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,3io_lib:format/2Format 参数的控制序列 pP 对二进制数据的处理不太好。这个在 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/2eval/2fold/4info/2 的新 tmpdir 选项可用于设置连接用于临时文件的目录。该选项还会覆盖 keysort/3sort/2tmpdir 选项。

    • 新的 lookup 选项可用于断言在评估某些 QLC 表达式时会查找常量。

    • cachecache_all 选项接受新的标签:etslistno。标签 list 使用临时文件将答案缓存在列表中(如果答案无法保存在 RAM 中)。结合使用 {cache,list}{unique, true} 等同于调用选项 unique 设置为 truesort/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/2lists: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 表的两个回调函数 TraverseFunLookupFun 现在允许返回一个列表以外的项。这样的项会立即作为当前查询的结果返回,并且主要用于返回错误元组。

    还修复了一些其他小 bug。

    自有 ID:OTP-5195

  • STDLIB 模块 error_logger_file_herror_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/2lists:ukeymerge/3 已更改为,如果它们的键匹配,则认为两个元组相等。

    为了保持一致性,lists:usort/2lists: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:fwriteio_lib:fwrite 的格式化选项 ~s 已扩展为处理二进制数据或 I/O 列表的参数。

    自身 ID: OTP-5403

  • 函数 io:format/2,3io_lib:format/2Format 参数中的控制序列 pP 已更改为将包含可打印字符的二进制数据的内容显示为字符串。

    自身 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_fsmgen_serverio_liblib(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/1gb_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_setssetsordsets 共有的所有函数的列表。

    * 潜在的不兼容性 *

    内部 ID: OTP-5277

  • 调试消息已从 QLC 模块中删除。

    内部 ID: OTP-5283

改进和新功能

  • 已减少从 dets:match/1,3dets:match_object/1,3dets: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 模块的手册页已更新,其中包含对新的 zipunzippartition/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