檢視原始碼 STDLIB 發行說明
此文件描述了 STDLIB 應用程式的變更。
STDLIB 6.2
修正的錯誤和故障
現在可以透過再次按下 ^[h 來展開按下 ^[h 時顯示的幫助文字。
自有 ID:OTP-19260 輔助 ID:PR-8884
在 Shell 中使用
fun Name/Arity
語法定義 fun 會失敗。此問題已修正,現在以下操作有效:1> F = fun is_atom/1. #Fun.erl.42.18682967> > F(a). true 3> Id = fun id/1. #Fun.erl.42.18682967> 4> Id(42). ** exception error: undefined shell command id/1 5> id(I) -> I. ok 6> Id(42). 42
除錯器也已修正,可正確處理 BIF 的此語法。
修正了完成 'fun(' 時導致 Shell 當機的錯誤。
自有 ID:OTP-19351 輔助 ID:PR-9043
修正了嘗試完成以 '/' 或變數開頭,後接 '(' 或 '/' 的運算式時導致 Shell 當機的錯誤。例如 Foo/ 和 Foo(。
自有 ID:OTP-19361 輔助 ID:PR-9078
zip:extract/2
搭配keep_old_files
現在會遵守cwd
選項。修正了 uri_string:percent_decode 規格中的錯誤
自有 ID:OTP-19380 輔助 ID:GH-8755
改進和新功能
更新了 Shell 文件以顯示類型規格,也就是說,
h(erlang, min, 2)
) 現在會在 Shell 中列印類型規格和文件。> h(erlang,min,2). -spec min(Term1, Term2) -> Minimum when Term1 :: term(), Term2 :: term(), Minimum :: term(). Returns the smallest of Term1 and Term2. If the terms compare equal with the == operator, Term1 is returned.
file:io_device/0
類型已更新,以清楚顯示raw
和cooked
IoDevice 之間的差異。自有 ID:OTP-19301 輔助 ID:PR-8956
新增了
json:format_key_value_list/3
和json:format_key_value_list_checked/3
。自有 ID:OTP-19320 輔助 ID:PR-8889
改進了 計時器 的文件。
自有 ID:OTP-19360 輔助 ID:ERIERL-1149、PR-9062
新增了對
io:user/0
、io:standard_io/0
和io:standard_error/0
的記錄支援。如需更多詳細資訊,請參閱io:setopts/2
。自有 ID:OTP-19372 輔助 ID:PR-8947
STDLIB 6.1.2
修正的錯誤和故障
透過此變更,當 URI 對應中未提供路徑時,uri_string:normalize 會假設為空路徑(不會當機)。
自有 ID:OTP-19266 輔助 ID:ERIERL-1127、PR-8890
修正了
json:format/3
的規格。
STDLIB 6.1.1
修正的錯誤和故障
移除
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
透過此變更,關閉程序會處理執行關閉的監管者與其他原因導致的子程序終止之間的競爭狀況。
自有 ID:OTP-19256 輔助 ID:PR-8780
STDLIB 6.1
修正的錯誤和故障
不正確的
io:format/0
字串的說明列印現在可以正確處理k
修飾符。修正了當關鍵字和元組出現在同一行時導致 Shell 完成當機的錯誤。
自有 ID:OTP-19157 輔助 ID:PR-8638
由於 PR-7419/OTP-18671,
callback_mode
的快取內部值開始洩漏到logger
報告中,這可能會導致logger
處理常式當機。現在已修正此問題,可以顯示設定的值,就像快取之前一樣。修正了與壓縮 ETS 表格相關的模擬器當機問題。
自有 ID:OTP-19176 輔助 ID:PR-8683
當找不到索引鍵時,
maps:update/3
的錯誤描述不再堅持第三個引數不是對應。自有 ID:OTP-19189
已修正為 Shell 建立文件的 Markdown 剖析器中的多個問題。
剖析器在括號內錯誤地剖析格式化的 Markdown(粗體或斜體)。這以前無法在 Shell 文件
(_Option._)
中正確顯示,而是逐字顯示。此修復會使Option.
以斜體顯示。Markdown 剖析器也用於建立其他文件格式,因此這是影響其他產生文件格式的錯誤。
修正了
unicode_util
中某些程式碼點範圍的類別。自有 ID:OTP-19210 輔助 ID:GH-8748
修正了
argparse
,使其在可用時列印子命令說明。自有 ID:OTP-19222 輔助 ID:PR-8777
改進和新功能
已新增來自圍籬程式碼區塊的 HTML 類別註釋。
自有 ID:OTP-19105 輔助 ID:PR-8499
新增了縮排輸出的 JSON 格式化函式。
自有 ID:OTP-19112
改進了意外的對應關聯的非法模式錯誤。
自有 ID:OTP-19128 輔助 ID:PR-8555
動態啟動的監管者的進度報告現在將記錄在除錯層級。
潛在不相容性
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
修正的錯誤和故障
修正,使遺失的
-doc({file, File})
檔案只會導致警告,而不會導致錯誤。自有 ID:OTP-19099 輔助 ID:PR-8542
修正了
json
錯誤,json:encode_key_value_list/2
未產生陣列,而json:decode/3
未針對0
叫用使用者回呼。
STDLIB 6.0
修正的錯誤和故障
binary
模組中的規格已更新,以反映文件所允許的內容。自有 ID:OTP-18684 輔助 ID:PR-7481
binary
模組中的數個函式會在某些情況下接受錯誤類型的引數。在此版本中,現在當給定不正確的類型時,它們會引發例外。如果主體二進位檔為空或給定
{scope,{0,0}}
選項,則下列函式會接受無效模式:binary:match/2,3
、binary:matches/2,3
、binary:replace/3,4
和binary:split/2,3
呼叫
binary:copy(<<1:1>>, 0)
會傳回空的二進位檔,而不是引發例外。同樣地,嘗試在位元字串的第 0 個位置提取 0 個位元組時,呼叫binary:part/2,3
會傳回空的二進位檔,而不是引發例外。預處理器的文件現在提到,可以在
-if
或-elif
指令的條件中呼叫defined(Name)
,以測試Name
是否為已定義巨集的名稱。(此功能已在 OTP 21 中實作。)如果
-if
或-elif
中呼叫的函式名稱不是 guard BIF 的名稱,則不會產生編譯錯誤,而是會導致跳過指令後的程式碼行。現在已將此變更為編譯錯誤。潛在不相容性
現在,當
eof
是回呼函式傳回的最後一個項目時,使用 I/O 協定的get_until
請求會正確傳回二進位資料或列表。已增強
simple_one_for_one
supervisor 的錯誤處理。返回ignore
的暫時子程序將不再導致崩潰。此外,已停用自動關閉,因為對於此類 supervisor 沒有意義。允許這樣做被視為錯誤。因此,我們不認為這是一個不相容的變更。
潛在不相容性
自身 ID:OTP-19029 輔助 ID:PR-8230
修正 shell 擴充功能,使其在擴充具有非 atom 鍵的 map 時不會崩潰,並且在給定引數時不會列出零元函式。
改進和新功能
函式
is_equal/2
、map/2
和filtermap/2
已新增至模組sets
、ordsets
和gb_sets
。編譯器現在會針對函式頭部不匹配發出更友善的錯誤訊息。例如,給定
a() -> ok; a(_) -> error.
Erlang/OTP 26 及更早版本會發出類似以下的診斷資訊
t.erl:6:1: head mismatch % 6| a(_) -> error. % | ^
而在 Erlang/OTP 27 中,診斷資訊類似於
t.erl:6:1: head mismatch: function a with arities 0 and 1 is regarded as two distinct functions. Is the number of arguments incorrect or is the semicolon in a/0 unwanted? % 6| a(_) -> error. % | ^
自身 ID:OTP-18648 輔助 ID:PR-7383
zip:create/2,3
現在可以容忍提供的file_info
記錄中的 POSIX 時間戳記。自身 ID:OTP-18668
回呼函式
gen_statem:handle_event/4
已在gen_statem
引擎中快取,以最佳化回呼函式呼叫速度。自身 ID:OTP-18671 輔助 ID:PR-7419
類型
beam_lib:beam/0
現在已匯出。自身 ID:OTP-18716 輔助 ID:PR-7534
已改進
binary
模組的文件。自身 ID:OTP-18741 輔助 ID:PR-7585
binary:replace/3,4
現在支援使用 fun 來提供替換的二進位資料。自身 ID:OTP-18742 輔助 ID:PR-7590
已根據 EEP 64 實作三引號字串。請參閱參考手冊中的 字串。
範例
1> """ a b c """. "a\nb\nc"
現在,相鄰且沒有插入空白字元的字串文字是語法錯誤,以避免可能與三引號字串混淆。例如
1> "abc""xyz". "xyz". * 1:6: adjacent string literals without intervening white space
潛在不相容性
新的函式
proc_lib:set_label/1
可用於將描述性詞彙新增至任何沒有已註冊名稱的程序。該名稱將顯示在c:i/0
、observer
等工具中,並且會包含在使用gen_server
、gen_statem
、gen_event
和gen_fsm
的程序產生的當機報告中。可以透過呼叫
proc_lib:get_label/1
來擷取程序的標籤。請注意,這些函式適用於任何程序,而不僅僅是使用
proc_lib
的程序。範例
1> self(). <0.90.0> 2> proc_lib:set_label(my_label). ok 3> i(). . . . <0.90.0> erlang:apply/2 2586 75011 0 my_label c:pinfo/2 51 4> proc_lib:get_label(self()). my_label
已將
-callback
屬性新增至模組sys
和erl_error
。自身 ID:OTP-18793 輔助 ID:PR-7703
已將數個接受 fun 的新函式新增至模組
timer
。函式
apply_after/2
、apply_interval/2
和apply_repeatedly/2
接受零元 fun 作為第二個引數,而函式apply_after/3
、apply_interval/3
和apply_repeatedly/3
接受 n 元 fun 作為第二個引數,並接受 fun 的 n 個引數列表作為第三個引數。自身 ID:OTP-18808 輔助 ID:PR-7649
已根據 EEP 66 實作字串文字上的 Sigil,也就是說:逐字和跳脫字元變體中的二進位和字串 Sigil,以及預設 (vanilla) Sigil。全部適用於普通字串和三引號字串 (EEP 64)。請參閱參考手冊中的 Sigil。
範例
1> ~"Björn". <<"Björn"/utf8>> 2> ~b"Björn". <<"Björn"/utf8>> 3> ~S"\s*(\w+)". "\\s*(\\w+)" 4> ~B"\s*(\w+)". <<"\\s*(\\w+)">>
自身 ID:OTP-18825 輔助 ID:OTP-18750, PR-7684
已匯出函式
shell:default_multiline_prompt/1
、shell:inverted_space_prompt/1
和shell:prompt_width/1
,以協助自訂提示實作。shell 現在會對來自文件說明命令 (
h(Module)
)、自動完成和搜尋命令的長輸出進行分頁顯示。自身 ID:OTP-18846 輔助 ID:PR-7845
現在,
M-h
快捷鍵 (Alt/Option-h) 會為游標前的模組或函式輸出說明。自身 ID:OTP-18847 輔助 ID:PR-7846
新增了對新增自訂程式碼格式化器的支援,該格式化器可以在提交時以您偏好的格式格式化您的多行 shell 命令。請參閱
shell:format_shell_func/
和shell:erl_pp_format_func/1
。自身 ID:OTP-18848 輔助 ID:PR-7847
新增了 shell 函式,用於檢視、忘記和儲存本機定義的函式、類型和記錄。
自身 ID:OTP-18852 輔助 ID:PR-7844
新增了
string:jaro_similarity/2
,可用於計算兩個字串之間的相似度。自身 ID:OTP-18865 輔助 ID:PR-7879
新的函式
ets:update_element/4
類似於ets:update_element/3
,但採用預設元組作為第四個引數,如果不存在具有該鍵的先前記錄,則將插入該元組。自身 ID:OTP-18870 輔助 ID:PR-7857
新增了從
gb_trees
和gb_sets
擷取下一個較高或較低鍵/元素的函式,以及傳回從給定鍵/元素開始的迭代器。自身 ID:OTP-18874 輔助 ID:PR-7745
當使用 shell 內建函式
c/1,2
重新編譯模組時,原始編譯的目前工作目錄現在會新增至 include 路徑。自身 ID:OTP-18908 輔助 ID:PR-7957
timer
模組現在會使用私有表格來管理其內部狀態,從而稍微提高其效能。自身 ID:OTP-18914 輔助 ID:PR-7973
已實作 EEP-59 - 文件屬性。
文件屬性可用於記錄函式、類型、回呼和模組。關鍵字
-moduledoc "Documentation here".
用於記錄模組,而-doc "Documentation here".
可用於在函式、類型和回呼頂部記錄它們。類型、回呼和函式文件可以透過
-doc false
或-doc hidden
設定為hidden
。當文件屬性將類型標記為隱藏時,它們將不會是文件的一部分。依預設,來自
moduledoc
和doc
的文件會以 EEP-48 的格式新增至二進位 beam 檔案中。使用編譯器旗標
warn_missing_doc
時,如果匯出的函式、類型和回呼中缺少-doc
屬性,則會引發警告。當已記錄的函式、類型和回呼中缺少 spec 屬性時,使用編譯器旗標
warn_missing_spec_documented
將會引發警告。moduledoc
和doc
可以參考要嵌入的外部檔案,例如-doc {file, "README.md"}.
,它會參考目前工作目錄中的README.md
檔案。編譯器會針對規格 (specs) 參照到隱藏類型的已匯出函式發出警告。因此,當已匯出函式中使用隱藏類型 (表示該類型不是文件的一部分) 時,將會出現警告。
Own Id: OTP-18916 Aux Id: PR-7936
新的
ets
函式ets:first_lookup/1
、ets:next_lookup/2
、ets:prev_lookup/2
和ets:last_lookup/1
。例如:ets:next_lookup/1
等同於先執行ets:next/2
,然後再執行ets:lookup/2
,並使用下一個鍵。新的合併函式效率更高,並保證原子性。Own Id: OTP-18923 Aux Id: PR-6791
maybe
表達式現在預設為啟用。若要將
maybe
作為 atom 使用,則需要用單引號括起來。或者,可以透過停用maybe_expr
功能來停用maybe
表達式。這可以透過在 Erlang 原始檔的開頭放置以下程式碼行來完成-feature(maybe_expr, disable).
停用
maybe_expr
功能的另一種方法是將-disable-feature
選項傳遞給erlc
erlc -disable-feature maybe_expr some_file.erl
Own Id: OTP-18944 Aux Id: PR-8067
編譯器現在會在更新 record/map 字面值時發出警告。例如,考慮以下模組
-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}. % | ^
Own Id: OTP-18951 Aux Id: PR-8069
文件已遷移為使用 Markdown 和 ExDoc。
Own Id: OTP-18955 Aux Id: PR-8026
最佳化
ets:foldl
和ets:foldr
以使用新的ets:next_lookup
。同時使其免受表格重新命名的影響。Own Id: OTP-18993 Aux Id: PR-8048
Windows 現在支援
math
中的所有函式。Own Id: OTP-19001 Aux Id: PR-8164
erl_lint
(以及延伸的compiler
) 現在會針對使用已棄用回呼的程式碼發出警告。目前唯一已棄用的回呼是
gen_server
、gen_event
和gen_statem
中的format_status/2
。您可以使用
nowarn_deprecated_callback
來關閉警告。Own Id: OTP-19010 Aux Id: PR-8205
編碼和解碼都可以自訂。解碼可以以類似 SAX 的方式完成,並處理多個文件和資料串流。
Own Id: OTP-19020 Aux Id: PR-8111
STDLIB 5.2.3.3
已修復的錯誤和故障
修正了 uri_string:percent_decode 規格中的錯誤
Own Id: OTP-19380 Aux Id: GH-8755
STDLIB 5.2.3.2
已修復的錯誤和故障
透過此變更,關閉程序會處理執行關閉的監管者與其他原因導致的子程序終止之間的競爭狀況。
Own Id: OTP-19256 Aux Id: PR-8780
透過此變更,當 URI 對應中未提供路徑時,uri_string:normalize 會假設為空路徑(不會當機)。
Own Id: OTP-19266 Aux Id: ERIERL-1127, PR-8890
STDLIB 5.2.3.1
已修復的錯誤和故障
修正了當關鍵字和元組出現在同一行時導致 Shell 完成當機的錯誤。
Own Id: OTP-19157 Aux Id: PR-8638
STDLIB 5.2.3
已修復的錯誤和故障
修復 erlang shell 中
-type a() :: $a.
的 shell 擴展。Own Id: OTP-19062
修復 shell 工作控制模式,使其在輸入
TAB
或CTRL+R
時不會崩潰。Own Id: OTP-19072 Aux Id: PR-8391
STDLIB 5.2.2
已修復的錯誤和故障
在巨集引數中使用
maybe
建構可能會導致編譯器崩潰。Own Id: OTP-19031 Aux Id: GH-8268
STDLIB 5.2.1
已修復的錯誤和故障
argparse
顯示的說明文字現在將以正確的順序顯示子命令引數。Own Id: OTP-18900 Aux Id: PR-7945, GH-7934
釐清了關於使用者定義說明範本的 argparse 文件。
Own Id: OTP-18937
修復 shell 擴展,使其在擴展使用無效原子時不會崩潰。
Own Id: OTP-18953 Aux Id: GH-8016 PR-8075
STDLIB 5.2
已修復的錯誤和故障
使
shell_docs
正確修剪程式碼區塊末尾的換行符號。Own Id: OTP-18777 Aux Id: PR-7663
將某些檔案中非故意的 Erlang Public License 1.1 標頭替換為預期的 Apache License 2.0 標頭。
Own Id: OTP-18815 Aux Id: PR-7780
修復了自動完成在嘗試擴展巢狀 tuple 時可能會使 shell 崩潰的錯誤。
Own Id: OTP-18822 Aux Id: PR-7796
移除了自動完成中函式引數、tuple、record 和 map 的自動關閉功能,因為這可能會干擾 atom 的自動完成。
Own Id: OTP-18823
修復了自動完成字串格式化會移除名稱相同但大小寫不同的建議的錯誤。
Own Id: OTP-18824
修復 shell 中的 ctrl+h 和 ctrl+backspace,使其只移除一個字元而不是整個單字。
Own Id: OTP-18826 Aux Id: PR-7797
修復使其可以覆寫 shell 的預設鍵盤快速鍵。
Own Id: OTP-18827 Aux Id: PR-7797
允許在受限 shell 中使用 shell 本機函式 v()。
Own Id: OTP-18828 Aux Id: PR-7799
在撰寫無效屬性 (如 '1> -hej.') 時報告語法錯誤。
Own Id: OTP-18829 Aux Id: PR-7799
當嘗試在 map 產生器的鍵中比對 record 的一部分時,將比對整個 record。
Own Id: OTP-18866 Aux Id: GH-7875, PR-7878
改進和新功能
意外使用未來三引號字串分隔符號的警告已升級為改為警告沒有插入空白字元的相鄰字串,這實際上與字串開頭相同,但也涵蓋了字串結尾的相同情況。
Own Id: OTP-18821 Aux Id: OTP-18746
原先計畫在 OTP 27 中移除已棄用的
slave
模組,已延後至 OTP 29。Own Id: OTP-18840 Aux Id: PR-7629
已將 guard 新增至
gen_*:start*
API 函式,以便更早捕獲錯誤引數。在此變更之前,在某些情況下,錯誤引數可能會隨之而來,並導致伺服器在啟動後立即失敗。Own Id: OTP-18857 Aux Id: GH-7685
STDLIB 5.1.1
改進和新功能
在減少已儲存的歷史記錄和結果數量時,對 shell 處理序進行垃圾回收。
Own Id: OTP-18773 Aux Id: PR-7691
STDLIB 5.1
已修復的錯誤和故障
當編譯呼叫
is_record/3
且 tuple 大小為巨大的正數時,編譯器可能會永遠執行。當在函式主體中使用時,呼叫is_record(A, a, 0)
會使編譯器崩潰。當在 guard 中使用時,編譯器會發出不正確的程式碼,該程式碼會接受{a>
作為 record。Own Id: OTP-18605 Aux Id: GH-7298, GH-7317
修復
ets:tab2file
中可能在另一個 Erlang 處理序同時建立相同檔案時導致其失敗的錯誤。Own Id: OTP-18614 Aux Id: GH-7162, PR-7237
現在將在 shell 中以友好的方式報告
{else_clause,Value}
例外。Own Id: OTP-18616 Aux Id: GH-7258
修正錯誤情況的傳回值,使其符合文件記錄和預期的傳回值 {error, {already_started, pid()}} (當使用本機註冊名稱時)。
Own Id: OTP-18627 Aux Id: PR-7072
sys:get_state/1,2
和sys:replace_state/2,3
已更正為將名為error
的狀態作為狀態名稱處理,而不是作為失敗的系統回呼處理。對於標準伺服器行為,當狀態名稱為
error
時,這僅對gen_statem
(和gen_fsm
) 造成問題,如果完整狀態為{error,_}
,則對gen_server
造成問題。Own Id: OTP-18633
filelib:safe_relative_path/2
中修復了多個問題。如果它的第二個引數是包含符號連結的路徑,則可能會傳回不正確的結果 patch。此外,有時路徑會被錯誤地認為是不安全的。Own Id: OTP-18655 Aux Id: GH-6460, PR-7208
修復當
erl.exe
在 Windows 上作為管道的一部分使用並嘗試設定standard_io
裝置的編碼時發生的死鎖。Own Id: OTP-18675 Aux Id: PR-7473 GH-7459
擴充了關於如何使用
standard_io
、standard_error
和user
I/O 裝置的文件。新增了類型
io:standard_io/0
、io:standard:error/0
和io:user/0
。Own Id: OTP-18676 Aux Id: PR-7473 GH-7459
修復
h/2,3
以正確呈現多子句文件。Own Id: OTP-18683 Aux Id: PR-7502
由
timer:apply_after/4
、apply_interval/4
和apply_repeatedly/4
建立的計時器,如果計時器到期時無法產生新的進程,會靜默地執行失敗。這個問題現在已修正,如果產生進程失敗,系統會當機並產生錯誤傾印。自有 ID:OTP-18759 輔助 ID:GH-7606
當 Erlang 原始程式檔缺少模組定義時,檔案中的每個規格都會出現虛假的「模組名稱不得為空」的診斷訊息。
自有 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
在 OTP 27 中,由於
0.0
將不再被視為與-0.0
相等,因此對0.0
進行模式匹配和等價性 (=:=
、=/=
) 比較時,現在會引發警告。如果需要明確匹配
0.0
(與-0.0
不同),則可以寫入+0.0
來抑制警告。算術比較運算符不受影響,包括算術相等 (
==
)。* 潛在的不相容性 *
自有 ID:OTP-18696
在 OTP-26.0 中引入的
gen_{server,statem,event}
行為的同步啟動行為 (使用 OTP-18471),已在文件中進行說明。自有 ID:OTP-18705 輔助 ID:GH-7524, OTP-18471, GH-6339, PR-6843
新增了設定自訂多行提示的功能。
自有 ID:OTP-18736 輔助 ID:PR-7564
已根據 EEP 64 實作了針對 (意外使用) 三引號字串的警告。
* 潛在的不相容性 *
自有 ID:OTP-18746 輔助 ID:PR-7313, PR-7456
現在可以設定 Shell 的鍵盤快捷鍵。
自有 ID:OTP-18754 輔助 ID:PR-7604 PR-7647
STDLIB 5.0.2
修正的錯誤和故障
修正了在終端機中輸入 Alt+Enter 時,游標會移至最後一行,而不是移至下一行的錯誤。
自有 ID:OTP-18580 輔助 ID:PR-7242
修正在使用
-noshell
啟動 Erlang 時,從 stdin 讀取時的 eof 處理。自有 ID:OTP-18640 輔助 ID:PR-7384 GH-7368 GH-7286 GH-6881
修正了在 Shell 中寫入提示後收到輸出時,輸出會消失的問題。
自有 ID:OTP-18652 輔助 ID:PR-7242
以下函數在給定長列表或二進制時,現在速度快得多:
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自有 ID:OTP-18659 輔助 ID:PR-7426
STDLIB 5.0.1
修正的錯誤和故障
POSIX 錯誤
exdev
有時會在某些錯誤訊息中被錯誤地描述為「跨域連結」。自有 ID:OTP-18578 輔助 ID:GH-7213
STDLIB 5.0
修正的錯誤和故障
dets
中的所有進程呼叫都已更新為使用接收佇列最佳化。自有 ID:OTP-18275 輔助 ID:PR-6045
當啟動的進程失敗時,
proc_lib:start*/*
已變為同步。這要求失敗的進程使用新的函數proc_lib:init_fail/2,3
或退出,以表示失敗。所有 OTP 行為都已修正以執行此操作。所有這些啟動函數現在都會消耗來自進程連結的
'EXIT'
訊息以進行所有錯誤返回。先前只有start_link/*
函數會執行此操作,而且僅在啟動的函數退出時,而不是在使用init_ack/1,2
或init_fail/2,3
建立傳回值時。* 潛在的不相容性 *
自有 ID:OTP-18471 輔助 ID:GH-6339, PR-6843
修正了
file:read(standard_io, ...)
在二進制模式下意外返回eof
的錯誤。自有 ID:OTP-18486 輔助 ID:PR-6881
在 Shell 中,如果指令的傳回值為
undefined
,v(N)
將無法擷取指令。自有 ID:OTP-18548 輔助 ID:PR-6967
改進與新功能
Erlang Shell 已改進以支援以下功能:
- 自動完成變數、記錄名稱、記錄欄位名稱、映射鍵、函數參數類型和檔案名稱。
- 在 Shell 中開啟外部編輯器 (使用 C-o),以便在編輯器中編輯目前的運算式。
- 支援在 Shell 中定義記錄 (具有類型)、函數和函數類型規範,以及自訂類型。
- 不要將分頁器指令和 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。
- Tab 擴充現在適用於使用 JCL 介面啟動的遠端節點。
- 現在可以設定 Shell 標語和會話標語 (也就是您啟動 Erlang Shell 時出現的文字)。請參閱核心文件以了解更多詳細資訊。
- 新增了 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
將選項
post_process_args
和detached
新增至peer:start
函數。自有 ID:OTP-18176 輔助 ID:PR-6118
re:replace/3,4
函數現在接受函數作為替換參數。自有 ID:OTP-18221 輔助 ID:PR-6197
base64
模組的效能已大幅提升。例如,在具有 JIT 的 x86_64 系統上,編碼和解碼速度都比 Erlang/OTP 25 快三倍以上。自有 ID:OTP-18228 輔助 ID:GH-5639
改進了
timer:apply_interval/4
的實作,減少了計時器伺服器上的負載,並導入了新函數timer:apply_repeatedly/4
。timer:apply_repeatedly/4
類似於timer:apply_interval/4
,但timer:apply_repeatedly/4
會防止觸發的apply
操作並行執行,而timer:apply_interval/4
不會。自有 ID:OTP-18236 輔助 ID:PR-6256
base64
模組現在支援使用替代 URL 安全字母進行編碼和解碼,以及接受或新增遺失的=
填補字元的選項。自有 ID:OTP-18247 輔助 ID:PR-6280, PR-6711
新增了
shell:whereis/0
,可用於尋找目前的 Shell 進程。自有 ID:OTP-18272 輔助 ID:PR-6279
Erlang Shell 在輸入
tab
時的自動完成已變更為在編輯目前行之後發生,而不是在編輯之前發生。可以使用
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
節點現在會在從啟動節點的 I/O 串流中包含來自節點的標準錯誤。自有 ID:OTP-18287 輔助 ID:PR-5955
已移除二進制語法中的限制。現在可以平行匹配二進制模式。範例:
<<A:8>> = <<B:4,C:4>> = Bin
自有 ID:OTP-18297 輔助 ID:GH-6348
改進了
unicode:characters_to_list()
的類型規範。自有 ID:OTP-18301 輔助 ID:PR-6350
在
lists
模組中,zip
系列函數現在接受選項,以允許處理不同長度的列表。自有 ID:OTP-18318 輔助 ID:PR-6347
文件中說明
$\^X
是 Control X 的 ASCII 代碼,其中 X 是大寫或小寫字母。但是,此表示法適用於任何字元 X,即使它沒有意義。在 Erlang/OTP 26 中,現在文件中說明以下字元也允許跟在
\^
字元之後:@
、[
、\
、]
、^
、_
和?
。嘗試使用其他字元將會因編譯器錯誤而被拒絕。$\^?
的值現在為 127 (而不是早期版本中的 31)。自有 ID:OTP-18337 輔助 ID:GH-6477, PR-6503
新增了
binary:encode_hex/2
函數,允許編碼後的十六進位數字使用小寫或大寫字母。專案 ID:OTP-18354 輔助 ID:PR-6297
引入了使用者可指定時間單位的
timer:tc()
變體。專案 ID:OTP-18355 輔助 ID:PR-6507
新增函數
math:tau/0
。回傳2*math:pi()
。專案 ID:OTP-18361 輔助 ID:PR-6536
現在允許在保護式和匹配規格中使用 BIF
min/2
和max/2
。專案 ID:OTP-18367 輔助 ID:GH-6544
最佳化了
gen_server:multi_call()
。專案 ID:OTP-18385 輔助 ID:PR-6698
現在已實作 EEP 58 中建議的 Map Comprehensions。
專案 ID:OTP-18413 輔助 ID:EEP-58, PR-6727
透過更改原子鍵的內部排序,最佳化了一些 Map 操作。這會改變小型 Map 中原子鍵的(未記錄)列印順序以及
maps:to_list/1
和maps:next/1
回傳的順序。新的順序是不可預測的,並且在 Erlang VM 的不同呼叫之間可能會發生變化。對於順序很重要的應用程式,有一個新的函數
maps:iterator/2
可以建立迭代器,以確定的順序回傳 Map 元素。另外,io:format()
的格式字串新增了k
和K
修飾符,以支援依序印出 Map 元素。專案 ID:OTP-18414 輔助 ID:PR-6151
使 gen_server 的 init/1 以新的回傳值「靜默」失敗。
專案 ID:OTP-18423 輔助 ID:https://github.com/erlang/backlog/issues/142
改進了選擇性接收最佳化,現在可以為從其他函數回傳的參考啟用此最佳化。
這大幅提高了
gen_server:send_request/3
、gen_server:wait_response/2
和類似函數的效能。專案 ID:OTP-18431 輔助 ID:PR-6739
為了載入使用某項功能的模組,不再需要在執行階段系統中啟用該功能。在編譯時於編譯器中啟用該功能就足夠了。
這表示,若要在 Erlang/OTP 26 中使用
maybe_expr
功能,在編譯期間啟用它就足夠了。在 Erlang/OTP 27 中,將預設啟用
maybe_expr
功能,但仍可以停用它。專案 ID:OTP-18445
靜態監督者在啟動後是非常閒置的程序,因此它們現在會在啟動後休眠,以改善資源管理。
專案 ID:OTP-18474 輔助 ID:PR-6895
棄用了
dbg:stop_clear/0
,因為它只是一個dbg:stop/0
的函數別名。專案 ID:OTP-18478 輔助 ID:GH-6903
ms_transform
中已新增對動作caller_line/0
、current_stacktrace/0
和current_stacktrace/1
的支援。專案 ID:OTP-18494 輔助 ID:PR-6924
模組
lists
中的列舉函數系列已擴充了enumerate/3
,允許提供步進值。專案 ID:OTP-18495 輔助 ID:PR-6943
將 Unicode 更新至 15.0.0 版。
專案 ID:OTP-18500
為
re
模組提供支援的正規表示式程式庫很可能會在 Erlang/OTP 27 中變更。請參閱即將發生的潛在不相容性。專案 ID:OTP-18511 輔助 ID:PR-7017
改進了當減去少量元素時
sets:subtract/2
的效能。專案 ID:OTP-18515 輔助 ID:GH-6990
linter 將不再為未完整指定的 opaque 類型引發警告。
專案 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+向上)/(alt+向上)
- 向下導覽 (ctrl+向下)/(alt+向下)
- 在行中間插入新行 (alt+enter)
- 導覽至頂端 (alt+<)/(alt+shift+向上)
- 導覽至底部 (alt+>)/(alt+shift+向下)
- 清除目前的運算式 (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 規格中的錯誤
Own Id: OTP-19380 Aux Id: GH-8755
STDLIB 4.3.1.5
已修正的錯誤和故障
透過此變更,關閉程序會處理執行關閉的監管者與其他原因導致的子程序終止之間的競爭狀況。
Own Id: OTP-19256 Aux Id: PR-8780
透過此變更,當 URI 對應中未提供路徑時,uri_string:normalize 會假設為空路徑(不會當機)。
Own Id: OTP-19266 Aux Id: ERIERL-1127, PR-8890
STDLIB 4.3.1.4
已修正的錯誤和故障
在巨集引數中使用
maybe
建構可能會導致編譯器崩潰。Own Id: OTP-19031 Aux Id: GH-8268
STDLIB 4.3.1.3
改進和新功能
在減少已儲存的歷史記錄和結果數量時,對 shell 處理序進行垃圾回收。
Own Id: OTP-18773 Aux 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
BIF
list_to_integer/1
和list_to_integer/2
現在會針對無法轉換為整數的過長列表引發system_limit
例外,而不是當機。同樣地,BIFstring:to_integer/1
現在會針對過長列表回傳{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
當在列表 Comprehension 中使用帶有複雜欄位初始化運算式的記錄做為篩選器時,編譯器可能會當機。
專案 ID:OTP-18336 輔助 ID:GH-6501, PR-6502
unicode:characters_to_binary()
可能會建構不必要的大型呼叫堆疊。專案 ID:OTP-18351 輔助 ID:ERIERL-885, PR-6529
改進和新功能
改善了 ets:new/2 名稱衝突的錯誤訊息。顯示「名稱已存在」,而不是較不具體的「無效選項」。
專案 ID:OTP-18283 輔助 ID:PR-6338
STDLIB 4.1.1
已修正的錯誤和故障
當監管控制連線的程序當機時,
peer
節點無法停止。當使用替代的控制連線時,當啟動peer
節點的節點停止該節點時,此監管程序也經常當機,導致peer
節點在沒有停止的情況下徘徊。專案 ID:OTP-18249 輔助 ID:PR-6301
STDLIB 4.1
已修正的錯誤和故障
修正了
global
中因nodeup
/nodedown
訊息在連線流量之前/之後未傳遞而導致的不一致錯誤。同時也修復了global_group
和global
中各種其他的不一致錯誤和死鎖。為了作為這些修復的基礎,引入了一個新的 BIF
erlang:nodes/2
,並擴展了net_kernel:monitor_nodes/2
。如果命令列上存在多個實例,
-hidden
和-connect_all
命令列參數將無法運作,此問題已修正。同時也引入了新的核心參數connect_all
,以取代-connect_all
命令列參數。自有 ID:OTP-17934 輔助 ID:PR-6007
修正了
public_key:ssh*
函式在「已移除功能使用者指南」中被列在錯誤版本下的問題。自有 ID:OTP-18139 輔助 ID:PR-6060
修正了
gen_statem
、gen_server
和gen_event
中format_status/1
的類型規格,以說明傳回值的類型與參數類型相同(而不是與參數值相同)。自有 ID:OTP-18142 輔助 ID:PR-6078
如果
timer
伺服器子規格已經存在於kernel_sup
中,但尚未啟動,則timer
伺服器將會啟動失敗並出現{error, already_present}
錯誤,而不是重新啟動伺服器。自有 ID:OTP-18146 輔助 ID:PR-5983
當在
gen_statem
中變更回呼模組時,舊模組的 state_enter 呼叫標誌會被用於新模組中的第一個事件,這可能會混淆新模組並導致故障。此錯誤已修正。在此變更中,部分
sys
除錯訊息格式已修改,這可能會對依賴該格式的除錯程式碼造成問題。* 潛在的不相容性 *
自有 ID:OTP-18239
改進與新功能
有一個新的組態選項
--enable-deterministic-build
,它會在建置 Erlang/OTP 時套用deterministic
編譯器選項。deterministic
選項已得到改進,以消除數個應用程式中更多不確定性的來源。自有 ID:OTP-18165 輔助 ID:PR-5965
rfc339_to_system_time/1,2
函式現在允許時區省略分鐘部分。自有 ID:OTP-18166 輔助 ID:PR-6108
gen_event
中的receive
陳述式已最佳化為不使用選擇性接收(這從來不需要,並且可能在高負載下導致嚴重的效能下降)。自有 ID:OTP-18194 輔助 ID:PR-6199
新增新的 API 函式 erl_features:configurable/0
自有 ID:OTP-18199 輔助 ID:PR-5790
STDLIB 4.0.1
已修正錯誤和故障
在 Erlang/OTP 25 的初始版本中,記錄初始化中繫結到
_
偽欄位的表達式總是會被評估一次,即使記錄中的所有其他欄位都已明確初始化。如果不是所有欄位都已初始化,這將會破壞將表達式error(...)
繫結到_
以取得異常的用例。繫結到
_
的行為已還原為 OTP 25 之前的行為,也就是,如果所有欄位都已繫結到明確的值,則不會評估該表達式。自有 ID:OTP-18110 輔助 ID:GH-6000
STDLIB 4.0
已修正錯誤和故障
改進 Erlang 程式碼檢查工具對未使用類型的檢查。
自有 ID:OTP-17370 輔助 ID:GH-4784
修正在
proc_lib:stop/3
中的競爭條件,當給定的逾時時間非常短時,該程序不會停止。自有 ID:OTP-17480 輔助 ID:GH-4853 PR-4872
現在
ms_transform
完全支援映射。自有 ID:OTP-17518 輔助 ID:GH-4915
修復當第一個參數為 self() 時,gen_server:call 會擲出錯誤而不是因逾時而失敗的問題。
對於 gen_statem:call/3、gen_event:sync_notify/2 和任何其他依賴內部 gen:call/3 函式的功能,也進行了相同的修復。
當使用 io:format/2 且目前的 group_leader 設定為目前的程序時,也進行了類似的修復。
* 潛在的不相容性 *
自有 ID:OTP-17544 輔助 ID:PR-5008
erl_pp 列印一元 - 和 + 運算子時,會在運算子和運算元之間加上空格。此問題已修正為兩者之間沒有任何空格。
自有 ID:OTP-17566 輔助 ID:PR-5095, GH-5093
調整 uri_string:normalize 對於未定義埠的 URI 行為 (具有埠冒號但沒有埠值的 URI 字串,或具有埠 => undefined 的 URI 映射)。
從 http_request 模組中移除多餘的正規化。
在此變更之前,正規化不會在這種情況下移除埠子元件,並且可能會傳回例如 "https://127.0.0.1:" URI。
* 潛在的不相容性 *
自有 ID:OTP-17627
修正
re:run
中的歸約計數錯誤,該錯誤導致函式在執行global
比對時過於頻繁地產生結果。自有 ID:OTP-17661 輔助 ID:PR-5165
修正當使用
read_concurrency
選項時,從ets:info(Tid,memory)
傳回的記憶體值。在此修復之前,排程器特定的鎖定快取行所使用的記憶體不計入總數。這導致在具有多個排程器的系統上,對於具有多個鎖定的表格,傳回的記憶體使用量非常不正確。
自有 ID:OTP-17832 輔助 ID:PR-5494
透過修正 gen_event 崩潰記錄列印中的參數順序,避免混淆。
自有 ID:OTP-17878
修正
string:next_grapheme/1
,使其在尾部傳回空二進位制字串,以便用於最後一個字形叢集的二進位制輸入。* 潛在的不相容性 *
自有 ID:OTP-18009 輔助 ID:PR-5785
修正
supervisor:sup_name/0
和supervisor:sup_ref/0
類型的類型規格。自有 ID:OTP-18034 輔助 ID:PR-4661, GH-4622
如果使用了預設記錄欄位初始化 (
_ = Expr
),即使所有記錄欄位都已明確初始化,也不會評估Expr
。這不是問題,除非Expr
會繫結一個後續使用的變數,在這種情況下,編譯器會崩潰。例如,如果記錄
#r{}
定義為只有一個欄位a
,則以下程式碼會使編譯器崩潰#r{a=[],_=V=42}, V
為了修正該問題,編譯器將確保
Expr
至少被評估一次。編譯器現在會將範例重寫為本質上V=42, #r{a=[]}, V
自有 ID:OTP-18083
改進與新功能
使用者現在可以使用
{write_concurrency, auto}
選項來配置 ETS 表格。此選項會強制表格在執行階段根據偵測到的並行程度,自動變更使用的鎖定數。當{write_concurrency, auto}
處於啟用狀態時,預設會啟用{decentralized_counters, true}
選項。此選項與其他 ETS 最佳化選項比較之下的基準測試結果可在此處取得
https://erlang.dev.org.tw/bench/ets_bench_result_lock_config.html
自有 ID:OTP-15991 輔助 ID:PR-5208
已棄用
gen_server
、gen_statem
和gen_event
的format_status/2
回呼,改用新的format_status/1
回呼。新的回呼增加了限制和變更更多內容的可能性,而不僅僅是狀態,例如最後收到的訊息、終止原因以及每個行為類型的更多特定事件。有關更多詳細資訊,請參閱各模組的文件。
自有 ID:OTP-17351 輔助 ID:GH-4673 PR-4952
timer
模組已現代化並變得更有效率,這使得計時器伺服器不易過載。timer:sleep/1
函式現在接受任意大的整數。自有 ID:OTP-17481 輔助 ID:PR-4811
新增
lists:enumerate/[1,2]
。自有 ID:OTP-17523 輔助 ID:PR-4928
現在可以在 XDG Config Home 目錄中找到組態檔案
.erlang
、.erlang.cookie
和.erlang.crypt
。有關更多詳細資訊,請參閱每個檔案和
filename:basedir/2
的文件。自有 ID:OTP-17554 輔助 ID:GH-5016 PR-5408 OTP-17821
在
calendar
函式system_time_to_rfc3339/2
和rfc3339_to_system_time
中支援native
時間單位。自有 ID:OTP-17592 輔助 ID:ERIERL-663, PR-5243
已最佳化標記元組測試和函式呼叫,現在比以前稍微便宜一些。
在確保所有裝箱的項在元數詞後至少分配一個字之後,這些最佳化成為可能。這是透過讓所有空元組都參考相同的空元組常值來完成的,這也減少了空元組的記憶體使用量。
自有 ID:OTP-17608
parallel_messages_SUITE 中的訊號佇列基準測試和 ets_SUITE 中的 ETS 基準測試具有基準測試結果視覺化 HTML 頁面,並帶有「填滿螢幕」按鈕,以使圖表更大。此按鈕以前無法按預期運作。當按下圖表的按鈕時,最後一個圖表被更大的版本取代,而不是按鈕上方的圖表。此問題已修正。
自有 ID:OTP-17630
新模組
peer
取代了slave
模組。slave
模組現在已過時,將在 OTP 27 中移除。peer
包含一個擴展且更強大的 API,用於啟動 erlang 節點。自有 ID:OTP-17720 輔助 ID:PR-5162
此變更在 uri_string 模組中引入了引號和取消引號函式 - 取代了 http_uri 中已棄用的編碼和解碼函式。
自有 ID:OTP-17778 輔助 ID:GH-5368
為了讓使用者更容易管理多個未完成的非同步
call
請求,已在erpc
、gen_server
、gen_statem
和gen_event
中引入了使用請求識別碼集合的新功能。自有 ID:OTP-17784 輔助 ID:PR-5792
更新至 Unicode 14.0 規格。
自有 ID:OTP-17869 輔助 ID:PR-5595
下列 ets 類型已重新命名為更清晰的名稱:
tab/0
改為table/0
,以及comp_match_spec/0
改為compiled_match_spec/0
。類型
table_access/0
和table_type/0
已匯出。自有 ID:OTP-17901 輔助 ID:GH-4968 PR-5649
新增對
.asn1
檔案的支援,使其能被加入filelib:find_file/1
和filelib:find_source/1
的預設搜尋規則中。自有 ID:OTP-17908 輔助 ID:GH-5655 PR-5669
已將類型規範加入
gen_server
,且已更新文件以利用此功能。這暴露出一些類型違規,已在
global
、logger_olp
和rpc
中修正。自有 ID:OTP-17915 輔助 ID:PR-5751, GH-2375, GH-2690
現在可以使用兩個或三個參數呼叫
erl_eval
的非本地函數處理器。當使用三個參數呼叫時,第一個參數是抽象格式中節點的註解。現在所有評估期間的錯誤都會透過
erlang:raise/3
傳遞。如果受限 shell 處於啟用狀態,且不允許erlang:raise/3
通過,則評估錯誤將以較不清晰的方式列印。請參閱shell
中受限 shell 的文件。* 潛在的不相容性 *
自有 ID:OTP-17925 輔助 ID:PR-5631
新增
filelib:ensure_path/1
,確保給定路徑的所有目錄都存在(與filelib:ensure_dir/1
不同,後者不會建立路徑的最後一段)。自有 ID:OTP-17953 輔助 ID:PR-5621
已將函數
groups_from_list/2
和groups_from_list/3
新增至maps
模組。自有 ID:OTP-17969 輔助 ID:PR-5588
已重構
gen_server
,當回呼在Timeout
欄位中傳回錯誤值 (timeout() | 'hibernate' | {'continue,_}
) 時,會擲出更易讀的例外,並且也會驗證gen_server:enter_loop/3,4,5
API 函數中的引數。自有 ID:OTP-17974 輔助 ID:GH-5683
已將用於移除重複項目的函數
uniq/1
和uniq/2
新增至lists
模組。自有 ID:OTP-17977 輔助 ID:GH-5606, PR-5766
新增了對 EEP-60 中所述的可設定功能的支援。功能可以在編譯期間使用選項(
-enable-feature Feature
、-disable-feature Feature
和+{feature, Feature, enable|disable}
)至erlc
,以及使用檔案中的指令 (-feature(Feature, enable|disable).
) 來啟用/停用。類似的選項可以用於erl
,以啟用/停用在執行階段允許的功能。新的maybe
運算式 (EEP-49) 完全支援作為功能maybe_expr
。功能的支援已記錄在參考手冊中。自有 ID:OTP-17988
自 OTP 25 起已棄用的函數
filename:safe_relative_path/1
已被移除。請改用filelib:safe_relative_path/2
。* 潛在的不相容性 *
自有 ID:OTP-17991
已將新的 PRNG 新增至
rand
模組:mwc59
,此 PRNG 是與 Sebastiano Vigna 合作開發的。它適用於需要非常快速的偽隨機數的應用程式,並且配有兩個輸出值擾亂器,一個快速和一個徹底。也匯出了
exsp
產生器的兩個內部函數,以便它們可以在rand
外掛程式框架之外使用,以減少一些開銷。也匯出了內部
splitmix64
產生器,這對於為自己的 PRNG 以外的其他 PRNG 類型設定種子很有用。自有 ID:OTP-18011
STDLIB 3.17.2.4
已修正的錯誤和故障
以下函數在給定長列表或二進制時,現在速度快得多:
- erlang:list_to_integer/1
- erlang:binary_to_integer/1
- erlang:binary_to_integer/2
- erlang:list_to_integer/2
- string:to_integer/1
自有 ID:OTP-18659 輔助 ID:PR-7426
STDLIB 3.17.2.3
改進和新功能
靜態監督者在啟動後是非常閒置的程序,因此它們現在會在啟動後休眠,以改善資源管理。
專案 ID:OTP-18556
STDLIB 3.17.2.2
已修正的錯誤和故障
不允許從保護式呼叫函數。當透過建構具有呼叫函數的預設初始化運算式的記錄時,編譯器未能拒絕保護式中的呼叫。
專案 ID:OTP-18325 輔助 ID:GH-6465, GH-6466
STDLIB 3.17.2.1
已修正的錯誤和故障
當在
gen_statem
中變更回呼模組時,舊模組的 state_enter 呼叫標誌會被用於新模組中的第一個事件,這可能會混淆新模組並導致故障。此錯誤已修正。在此變更中,部分
sys
除錯訊息格式已修改,這可能會對依賴該格式的除錯程式碼造成問題。* 潛在的不相容性 *
自有 ID:OTP-18239
STDLIB 3.17.2
已修正的錯誤和故障
shell_docs:get_doc/3
、shell_docs:get_callback_doc/3
和shell_docs:get_type_doc/3
的類型規範錯誤地指出傳回的Metadata
是空對應。自有 ID:OTP-18081
STDLIB 3.17.1
已修正的錯誤和故障
編譯時間不再記錄在 BEAM 檔案中。仍然有一些未記錄的函數嘗試擷取編譯時間。這些函數現在已被移除。
自有 ID:OTP-17962
STDLIB 3.17
已修正的錯誤和故障
修正不支援 Unicode 的終端機上 nbsp 的呈現。
自有 ID:OTP-17662 輔助 ID:PR-5206
改進
erl_error
列印輸出,當re
無法編譯正規表示式時,也會印出關於編譯失敗原因的提示。自有 ID:OTP-17750 輔助 ID:PR-5366
修正
supervisor_bridge:start_link()
的規格。自有 ID:OTP-17766 輔助 ID:PR-5362
在
supervisor
中新增遺失的關閉子句,這些子句可能導致錯誤的錯誤報告。自有 ID:OTP-17767 輔助 ID:PR-5344
改進和新功能
將
no_auto_import_types
加入 erl_lint,以允許模組定義與預定義類型同名的類型。自有 ID:OTP-17744 輔助 ID:PR-5292
STDLIB 3.16.1
已修正的錯誤和故障
修正一個錯誤,該錯誤可能導致當監督者在取消連結與將關閉訊號傳送給子程序之間死亡時,子程序變成孤立狀態。
也可能由於監督者關閉子程序與該子程序同時自行退出之間的競爭而導致不穩定的監督者報告。
自有 ID:OTP-17649 輔助 ID:GH-5193, PR-5201
STDLIB 3.16
已修正的錯誤和故障
修正
io:format
與~p
不再將浮點數解譯為可列印字元。自有 ID:OTP-17424 輔助 ID:GH-4801 PR-4803
修正 base64 編碼/解碼函數的規格以包含 0。
自有 ID:OTP-17429 輔助 ID:GH-4761
失敗的呼叫
io:format("~p\n")
會導致第 0 行的警告,而不是正確的行號和欄號。這已修正,並且所有對io:format()
的失敗呼叫的警告都已重新措辭,以更清楚地說明問題所在。自有 ID:OTP-17430
當給定選項
warn_missing_spec
和export_all
時,只會針對使用-export
屬性明確匯出的函數發出遺失規格的警告。自有 ID:OTP-17434 輔助 ID:GH-4772
使用內容是檔案名稱(而非目錄)的 atom 呼叫
c:ls/1
會導致當機。自有 ID:OTP-17463 輔助 ID:GH-4916
即使尚未看到
-module()
宣告,MODULE
和MODULE_STRING
巨集也始終會顯示為已定義(當由-ifdef
測試時)。已變更為,如果先前未看到-module()
,則-ifdef ?MODULE.
將不會認為 ?MODULE 已定義。自有 ID:OTP-17505 輔助 ID:GH-4995
修正 shell_docs 中呈現遺失類型和回呼的錯誤。
自有 ID:OTP-17573 輔助 ID:ERL-1264 GH-4270
當編譯器給定
deterministic
選項時,?FILE
巨集會在第一個include
指令之前展開為來源檔案的完整路徑,並且在include
指令之後展開為檔案名稱的基礎部分。自有 ID:OTP-17581 輔助 ID:PR-5141
修正損壞的
win32reg:delete_key
,並修正win32reg:value
的default
值。自有 ID:OTP-17622 輔助 ID:PR-5038
修正呼叫
maps:get(some_key, #{})
的錯誤資訊。自有 ID:OTP-17634 輔助 ID:GH-5196
改進和新功能
當提供無效的引數時,
io
模組中的大多數輸出函數現在會列印額外的錯誤資訊。這些函數為:io:format
、io:fwrite
、io:put_chars
、io:nl
和io:write
。自有 ID:OTP-17317 輔助 ID:PR-4757
EEP-54(提供更多錯誤相關資訊)現在包含
format_error
回呼的兩個新傳回值:general
和reason
。從
format_error
回呼傳回的多行錯誤描述現在會正確縮排。已擴充 Erlang 參考手冊中
erl_error
、error/3
和 錯誤和錯誤處理的文件。自有 ID:OTP-17454 輔助 ID:PR-4764
在
lists
模組的文件中,已澄清謂詞函式必須傳回布林值。自有 ID:OTP-17503 輔助 ID:GH-4985
已釐清
c:c/1
、c:c/2
和c:c/3
的文件。自有 ID:OTP-17571 輔助 ID:GH-5103
STDLIB 3.15.2
已修正的錯誤和故障
修正一個錯誤,該錯誤可能導致使用控制序列
p
或P
格式化元組並使用選項chars_limit
限制輸出時發生當機。自有 ID:OTP-17525 輔助 ID:GH-5053
STDLIB 3.15.1
修正的錯誤與故障
修正了一個當使用控制序列 p 或 P 格式化詞語,並使用
chars_limit
選項限制輸出時,可能導致迴圈的錯誤。自有 ID:OTP-17459 輔助 ID:GH-4824, GH-4842
STDLIB 3.15
修正的錯誤與故障
gen_statem
中使用相對時間0
的逾時行為不完全符合預期模型。現已修正。此修正引入了一個小的潛在不相容性,例如當將狀態逾時與插入的事件結合使用時,且插入的事件在具有逾時的狀態中進行狀態更改。在此修正之前,即使在第二次狀態更改後,也可能會傳遞狀態逾時,但現在可以保證狀態逾時僅在它開始的狀態中傳遞,即使在這種邊緣情況下也是如此。
* 潛在的不相容性 *
自有 ID:OTP-15107 輔助 ID:ERL-1381, PR-2813
修正了
erl_eval
中關於位元字串推導式的錯誤。自有 ID:OTP-16865
以點開頭的檔案名稱(例如 "
.gitignore
")現在被視為檔案名稱,而不是filename:extension/1
和filename:rootname/1
的副檔名。自有 ID:OTP-16905
修正了當使用
allow_missing_chunks
選項時,如果缺少具名區塊,beam_lib:chunks/3
會崩潰的錯誤。自有 ID:OTP-16950 輔助 ID:ERL-1378
浮點數零 (0.0) 可以是正數 (+0.0) 也可以是負數 (-0.0)。編譯器、執行時系統和 STDLIB 中已修正多個錯誤,以確保 0.0 上的負號不會遺失。
自有 ID:OTP-17077 輔助 ID:ERL-1431, PR-2903, PR-2905, PR-2906
當使用
-MMD
選項來產生依賴檔案和 BEAM 檔案時,消除了 Dialyzer 崩潰的問題。自有 ID:OTP-17118 輔助 ID:PR-2825
修正了
shell_docs
和erl_docgen
將em
標籤解釋為strong
的錯誤。自有 ID:OTP-17122
在 Solaris 上,
math:acos/1
和math:asin/1
函式對於有效域之外的引數不會失敗。自有 ID:OTP-17133
在使用
ms_transform
時,會靜默unused_record
警告。解析轉換ms_transform
將記錄替換為元組,這可能會導致 Erlang 程式碼檢查器發出有關未使用記錄的警告。自有 ID:OTP-17186
記錄了關於
re
模組中[:ascii:]
字元類匹配 Latin-1 字元的缺陷。自有 ID:OTP-17222 輔助 ID:GH-4544
修正了通用行為中啟動函式的
spec
。自有 ID:OTP-17342 輔助 ID:GH-4725 PR-4726
監督者拒絕關機值為 0 的子規格。
自有 ID:OTP-17364 輔助 ID:PR-4747
改進和新功能
在
rand
模組中,現在可以使用演算法別名:default
,來為預設演算法設定種子。使用
rand:bytes/1
和rand:bytes_s/2
實作了產生虛擬隨機二進制檔案的功能。自有 ID:OTP-14646 輔助 ID:PR-2920
已在
proplists
模組中新增了新函式:to_map/1,2
和from_map/1
。自有 ID:OTP-14647 輔助 ID:PR-2910
已在
queue
模組中新增了新函式:all/2
、any/2
、delete/2
、delete_r/2
、delete_with/2
和delete_with_r/2
。自有 ID:OTP-14650 輔助 ID:PR-2850
已在
queue
模組中新增了新函式:fold/2
和filtermap/2
。自有 ID:OTP-14793 輔助 ID:PR-2791
已刪除對在 OTP R15 之前建立的抽象程式碼的支援。
自有 ID:OTP-16678 輔助 ID:PR-2627
實作了 EEP 54 中提出的,關於 BIF 呼叫失敗的擴充錯誤資訊。
當 Erlang Shell 中的 BIF 呼叫失敗時,將會列印更多關於哪個或哪些引數發生錯誤的資訊。當 BIF 呼叫失敗時,
proc_lib
、common_test
和qlc
也會提供相同的擴充錯誤資訊。對於希望提供相同擴充錯誤資訊的應用程式,有新的函式
erl_error:format_exception/3
和erl_error:format_exception/4
。有一個新的
error/3
BIF,允許應用程式或程式庫以相同方式為其自身的例外狀況提供擴充錯誤資訊。自有 ID:OTP-16686
引入了 EEP 53 中概述的程序別名功能。引入它是為了提供一種輕量機制,可以防止在逾時或連線遺失後的回覆延遲。如需更多資訊,請參閱 EEP 53 和新的
alias/1
BIF 以及monitor/3
BIF 的新選項的文件。gen_server
、gen_statem
和gen_event
使用的框架中的call
操作已更新為利用別名以防止延遲回應。gen_statem
行為在分散式案例中仍然使用代理程序,因為它始終防止延遲回覆,並且別名不適用於 OTP 24 之前的節點。代理程序可以在 OTP 26 中移除。別名功能也使得引入與 gen 行為中
erpc:receive_response()
函式類似的新函式成為可能,因此還引入了新函式gen_server:receive_response()
、gen_statem:receive_response()
、gen_event:receive_response()
。自有 ID:OTP-16718 輔助 ID:PR-2735
改進了關於
gen_server
終止時發出的結束信號的文件。自有 ID:OTP-16910 輔助 ID:PR-2771
已在
maps
模組中新增了新函式:merge_with/3
、intersect/2
、intersect_with/3
、filtermap/2
、from_keys/2
和maps:foreach/2
。maps:merge_with/3
與merge/2
相同,但接受一個額外的 fun,用於組合具有相同鍵的項目。maps:intersect/2
計算兩個 Map 的交集。maps:intersect_with/3
與intersect/2
相同,但接受一個額外的 fun,用於組合相交的項目。maps:filtermap/2
允許在單次傳遞中篩選和映射 Map。maps:from_keys/2
從鍵的列表和單一值建構 Map,可用於最佳化集合運算,例如 from_list/1、filter/2、intersection/2 和 subtract/2。maps:foreach/2
允許對 Map 進行迭代,而不傳回任何值。自有 ID:OTP-16936 輔助 ID:ERL-1367
已移除實驗性的 HiPE 應用程式,以及其他應用程式中的所有相關功能。
* 潛在的不相容性 *
自有 ID:OTP-16963
已移除在 OTP 20 中已棄用的
filename:src/1
函式。請改用filelib:find_source/1,3
。* 潛在的不相容性 *
自有 ID:OTP-16971
已變更浮點數的漂亮列印器,以便更容易看出數字的整數部分是否已四捨五入。變更後,可能已四捨五入的數字始終會出現在最後一個或指數字元(e 或 E)之前。這是透過在整數部分可能被四捨五入的情況下,始終使用科學記號列印數字來完成。
自有 ID:OTP-16980 輔助 ID:ERL-1308
接受來自遠端節點的大小上限為 160 位元的參考。這是朝向在未來 OTP 版本中使用上限為 160 位元的參考的升級路徑的第一步。
自有 ID:OTP-17005 輔助 ID:OTP-16718
為
erl_parse:abstract/2
新增location
選項。自有 ID:OTP-17024
maps API 中的所有長時間執行函式現在都會產生結果。在先前的版本中,函式
maps:from_list/1
、maps:keys/1
和maps:values/1
不會產生結果。這可能會導致對程序的排程不公平。自有 ID:OTP-17057
現在,
sets
模組具有選用的基於 Map 的實作,如EEP 50
中所述。若要使用此實作,請將
{version,2}
選項傳遞給sets:new/1
或sets:from_list/2
。自有 ID:OTP-17059 輔助 ID:PR-2864
新增了
shell_docs:supported_tags/0
。此函式可用於檢索shell_docs
目前支援的標籤。自有 ID:OTP-17120
shell_docs
使用的application/erlang+html
文件儲存格式已更新,以包含標籤b
、strong
、h4
、h5
和h6
。自有 ID:OTP-17121
不要以不必要的括號漂亮列印
catch
表達式。PR-2584 中 Erlang 解析器文法的重寫表示,在許多情況下,不再需要catch
表達式周圍的括號。自有 ID:OTP-17169 輔助 ID:PR-2584
改進了
gen_server
文件中Module:init/1
中{continue,Continue}
的說明。自有 ID:OTP-17171 輔助 ID:PR-3011
現在,
erl_eval
模組接受 Map 來追蹤繫結。使用orddict
進行繫結仍然有效。自有 ID:OTP-17175
記錄了
epp:scan_erl_form/1
,並新增了epp:scan_file/2
。自有 ID:OTP-17199 輔助 ID:PR-2658
io
和io_lib
模組使用的標準浮點數列印演算法已從 [1] 中描述的演算法變更為 Ryu 演算法 [2]。這為大多數浮點數的列印帶來顯著的速度提升,並小幅改善了記憶體消耗。[1]: Robert G. Burger 和 R. Kent Dybvig。1996 年。快速且準確地列印浮點數。於 ACM SIGPLAN 1996 年程式語言設計與實作會議論文集 (PLDI '96)。美國紐約州紐約市電腦協會,108-116 頁。DOI:https://doi.org/10.1145/231379.231397
[2]: Ulf Adams。2018 年。Ryū:快速浮點數轉字串轉換。於第 39 屆 ACM SIGPLAN 程式語言設計與實作會議論文集 (PLDI 2018)。美國紐約州紐約市電腦協會,270-282 頁。DOI:https://doi.org/10.1145/3192366.3192369
感謝 Thomas Depierre
自身 ID:OTP-17210
在 binary 模組中新增十六進位編碼和解碼函式。
自身 ID:OTP-17236 輔助 ID:PR-3014
已移除未記載且部分損壞的
ets:filter/3
函式。自身 ID:OTP-17263
在
shell_docs
中新增支援以顯示任何"text"
文件格式。這表示 shell 中的h(Module)
現在可以顯示 Elixir 文件中的"text/markdown"
。自身 ID:OTP-17267
類型為
set
、bag
、duplicate_bag
的 ETS 表格中金鑰的內部雜湊已加入鹽值,以與erlang:phash2
不同。這是為了避免當使用phash2
將金鑰分佈到不同的表格/節點時,發生不良的雜湊情況。自身 ID:OTP-17276 輔助 ID:PR-2979
已更新至 Unicode 13.0 規格。
自身 ID:OTP-17327 輔助 ID:PR-4707
新增編譯器選項
{nowarn_unused_record, RecordNames}
。記載編譯器選項nowarn_unused_type
。自身 ID:OTP-17330
在監管者中實作 EEP 56。它新增了
significant
子項的概念,以及auto_shutdown
監管者旗標。如需更多資訊,請參閱監管者手冊頁面。
自身 ID:OTP-17334 輔助 ID:PR-4638、EEP-56
修正了程式碼中比對帶有底線前綴的變數時的警告。
自身 ID:OTP-17385 輔助 ID:OTP-17123
STDLIB 3.14.2.3
修正的錯誤和故障
不允許從保護式呼叫函數。當透過建構具有呼叫函數的預設初始化運算式的記錄時,編譯器未能拒絕保護式中的呼叫。
專案 ID:OTP-18325 輔助 ID:GH-6465, GH-6466
STDLIB 3.14.2.2
修正的錯誤和故障
修正一個錯誤,該錯誤可能導致使用控制序列
p
或P
格式化元組並使用選項chars_limit
限制輸出時發生當機。自有 ID:OTP-17525 輔助 ID:GH-5053
STDLIB 3.14.2.1
修正的錯誤和故障
修正了一個當使用控制序列 p 或 P 格式化詞語,並使用
chars_limit
選項限制輸出時,可能導致迴圈的錯誤。自有 ID:OTP-17459 輔助 ID:GH-4824, GH-4842
STDLIB 3.14.2
修正的錯誤和故障
由 zip 模組壓縮的字典沒有取得可執行權限(針對檔案擁有者),這使得字典內的檔案無法存取。此問題已修正,方法是給予 zip 封存檔內的字典 XRW 權限。
自身 ID:OTP-17295 輔助 ID:GH-4687
STDLIB 3.14.1
修正的錯誤和故障
處理
erl_parse:tokens()
中的映射。自身 ID:OTP-16978
已修正 erlang shell 函式
rr
,使其能夠從程式碼封存檔中的檔案讀取記錄。自身 ID:OTP-17182 輔助 ID:PR-3002
如果要求
beam_lib
傳回 Elixir 產生的 BEAM 檔案的抽象程式碼,且電腦上未安裝 Elixir,則beam_lib
將不再當機,而是會傳回錯誤元組。已更新cover:compile_beam()
和cover:compile_beam_directory()
函式,使其在該情況下也傳回錯誤元組。自身 ID:OTP-17194 輔助 ID:GH-4353
更正範例模組
erl_id_trans
中關於{char, C}
類型的內容。自身 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。
此變更已標記為可能不相容,因為 uri_string:normalize/2 過去會解碼與保留集中沒有的字元對應的百分比編碼字元三元組。在此變更之後,uri_string:normalize/2 將只解碼與未保留集(ALPHA / DIGIT / "-" / "." / "_" / "~")中的字元對應的百分比編碼三元組。
* 潛在的不相容性 *
自身 ID:OTP-16460
shell_docs
模組已擴展,可以針對渲染的文字設定 unicode、ansi 和欄位大小。自身 ID:OTP-16990
STDLIB 3.13.2
修正的錯誤和故障
如果呼叫的頂點在其名稱詞組中有 '_' 原子,則函式
digraph:in_edges/2
和digraph:out_edges/2
會傳回錯誤的邊緣。自身 ID:OTP-16655
filelib:wildcard("not-a-directory/..")
應傳回空清單。在 Windows 上,它傳回了"not-a-directory/.."
。自身 ID:OTP-16700
修正 shell_docs:render 的類型規格,使其對 MFA 使用正確的類型。
自身 ID:OTP-16739
當主機存在但輸入路徑不是絕對路徑時,修正 uri_string:recompose/1。
此變更防止在路徑不是以斜線開頭時,重新組合操作變更主機的頂層網域。
自身 ID:OTP-16751 輔助 ID:ERL-1283
當 '
if
' 預處理器指令引用未定義的符號時,epp
模組會傳回格式錯誤的錯誤詞組。當使用錯誤的錯誤詞組呼叫epp:format_error/1
時,會發生當機。自身 ID:OTP-16816 輔助 ID:ERL-1310
如果
Start > length(List) + 1
,lists:sublist(List, Start, Len)
會失敗並產生例外狀況,即使文件中明確說明「Start+Len
超出清單的長度並非錯誤」。自身 ID:OTP-16830 輔助 ID:ERL-1334、PR-2718
STDLIB 3.13.1
修正的錯誤和故障
當
simple_one_for_one 監管者
的暫時子項終止時,監管者的內部狀態會損壞,導致監管者保留監管者啟動後續子項的啟動引數,導致監管者的堆積不必要地增長。此狀態損壞也可能會導致其他問題。自身 ID:OTP-16804
STDLIB 3.13
修正的錯誤和故障
編譯具有過度巢狀結構的比對規格會導致執行階段系統因排程器堆疊耗盡而當機。在此情況下,受影響的函式現在會引發
system_limit
錯誤例外狀況,而不是使執行階段系統當機。自身 ID:OTP-16431 輔助 ID:ERL-592
如果受影響的欄位數量為零,則不再允許使用
_
初始化記錄欄位。自身 ID:OTP-16516
修正
eval_bits
中的錯誤。自身 ID:OTP-16545
改進和新功能
改善了 STDLIB 和 Kernel 中大多數 OTP 行為的單行記錄器事件的列印。這包括
proc_lib
、gen_server
、gen_event
、gen_statem
、gen_fsm
、supervisor
、supervisor_bridge
和application
。改善了
proc_lib
以及格式化例外狀況時,chars_limit
和depth
的處理方式。自身 ID:OTP-15299
移除 I/O 協定舊要求的用法和文件。
自身 ID:OTP-15695
改進了並行呼叫時的 ETS 可擴展性,這些呼叫會變更表格大小,例如
ets:insert/2
和ets:delete/2
。此效能功能已在 OTP 22.0 中針對
ordered_set
實作,現在適用於所有 ETS 表格類型。改進的可擴展性可能會導致
ets:info(T,size)
和ets:info(T,memory)
的延遲時間較長。因此,新增了一個新的表格選項decentralized_counters
。對於啟用write_concurrency
的ordered_set
,其預設值為true
,對於所有其他表格類型,其預設值為false
。自有 ID:OTP-15744 輔助 ID:OTP-15623,PR-2229
在
zip
模組中處理 Unicode 檔名。自有 ID:OTP-16005 輔助 ID:ERL-1003,ERL-1150
Unicode 支援已更新至 Unicode 12.1 標準。
自有 ID:OTP-16073 輔助 ID:PR-2339
所有的模組
proc_lib
、gen_server
、gen_statem
和gen_event
都已擴充start_monitor()
函式。如需詳細資訊,請參閱這些模組的start_monitor()
文件。自有 ID:OTP-16120 輔助 ID:ERIERL-402,PR-2427
更新了新的
erlang:term_to_iovec()
BIF。自有 ID:OTP-16128 輔助 ID:OTP-15618
記錄了有關從
erl_tar
中的檔案描述符提取的特性。自有 ID:OTP-16171 輔助 ID:ERL-1057
新增
ok
作為gen_server:reply/2
的傳回值自有 ID:OTP-16210 輔助 ID:PR-2411
已在
c
中新增函式,用於列印 Erlang 模組的內嵌文件。這些函式為:h/1,2,3 - 列印模組:函式/Arity 的文件。
ht/1,2,3 - 列印模組:類型/Arity 的類型文件。
內嵌文件是在建立 Erlang/OTP 文件時建立的。
自有 ID:OTP-16222
將
indent
和linewidth
新增至erl_pp
模組函式的選項中。自有 ID:OTP-16276 輔助 ID:PR-2443
由於進行了新的 spawn 改進,因此進行了一些小更新。
自有 ID:OTP-16368 輔助 ID:OTP-15251
現在,當在載入 NIF 的模組中使用內聯時,編譯器會發出警告。
自有 ID:OTP-16429 輔助 ID:ERL-303
重構了已棄用和已移除函式的內部處理方式。
自有 ID:OTP-16469
擴充
erl_parse:abstract/1,2
以處理外部函式表示式 (fun M:F/A
)。自有 ID:OTP-16480
新增
filelib:safe_relative_path/2
以取代filename:safe_relative_path/1
,後者無法安全地處理符號連結。filename:safe_relative_path/1
已被棄用。自有 ID:OTP-16483 輔助 ID:PR-2542
已新增模組
shell_docs
。此模組包含用於呈現、驗證和正規化內嵌文件的函式。自有 ID:OTP-16500
Shell 中的模組和函式自動完成現在會查看所有可用的模組,而不是僅限於已載入的模組。如果模組已載入,或在呼叫時會載入,則會將其視為可用。
自動完成也已擴充到可在
c
中新的h/1,2,3
函式中使用。自有 ID:OTP-16501 輔助 ID:OTP-16494、OTP-16222、OTP-16406、OTP-16499、OTP-16500、PR-2545、ERL-708
將內部
pcre
程式庫更新至8.44
。自有 ID:OTP-16557
STDLIB 3.12.1.2
修正的錯誤和故障
修正一個錯誤,該錯誤可能導致使用控制序列
p
或P
格式化元組並使用選項chars_limit
限制輸出時發生當機。自有 ID:OTP-17525 輔助 ID:GH-5053
STDLIB 3.12.1.1
修正的錯誤和故障
修正了一個當使用控制序列 p 或 P 格式化詞語,並使用
chars_limit
選項限制輸出時,可能導致迴圈的錯誤。自有 ID:OTP-17459 輔助 ID:GH-4824, GH-4842
STDLIB 3.12.1
修正的錯誤和故障
[re:run(Subject, RE, [unicode])](
re:run/3
) 在Subject
包含非法的 utf8 且RE
以二進位形式傳遞時,傳回nomatch
而不是使用badarg
錯誤例外狀況失敗。已修正此問題,同時修正了re:run()
錯誤案例中的歸約計數。自有 ID:OTP-16553
STDLIB 3.12
修正的錯誤和故障
修正 uri_string:normalize/2 的類型規格,該規格也可能傳回 error()。
自有 ID:OTP-16322
改進 uri_string:normalize/2 中的錯誤處理。此變更修正了輸入 URI 具有錯誤百分比編碼時的崩潰問題。
自有 ID:OTP-16351
修正 Erlang 美化列印器中的小錯誤 (
erl_pp
)。自有 ID:OTP-16435
修正 Erlang 分析器中關於連續一元運算子的問題。
自有 ID:OTP-16439
讓
calendar:rfc3339_to_system_time()
在缺少時間偏移時崩潰。自有 ID:OTP-16514 輔助 ID:ERL-1182
改進和新功能
實作 uri_string:resolve/{2,3},可用於解析相對於基礎 URI 的 URI 參考。
自有 ID:OTP-16321
在
gen_statem
中,現在可以變更執行中伺服器的回呼模組。請參閱gen_statem
的文件,瞭解change_callback_module
、push_callback_module
和pop_callback_module
。自有 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
例外狀況,而不是傳回錯誤 tuple。自有 ID:OTP-16052
修正了程式碼檢查器中的錯誤,其中清單和二進位推導可能會抑制不安全的變數錯誤。
自有 ID:OTP-16053 輔助 ID:ERL-1039
修正了
erl_tar:open/2
、create/2,3
和add/4
的錯誤類型規格。自有 ID:OTP-16085 輔助 ID:PR-2379
修正了
binary:list_to_bin/1
的錯誤類型規格。引數類型已從iodata/0
變更為iolist/0
。自有 ID:OTP-16132 輔助 ID:ERL-1041
修正了
pool:pspawn_link
中的競爭條件,該條件會導致在使用它來產生非常短暫的程序時擲回noproc
錯誤。自有 ID:OTP-16211
修正了 ETS 查閱中,在使用
compressed
選項且 term 包含原子時的效能問題。在此修正之前,原子的解壓縮演算法會不必要地採用全域鎖定來驗證原子。自有 ID:OTP-16316
改進和新功能
新增了一個新的編譯器/程式碼檢查器選項,可停用未使用類型的警告 (
nowarn_unused_type
)。自有 ID:OTP-16262 輔助 ID:ERIERL-435
已最佳化 ETS 表格,使其在只啟用一個排程器的系統中執行時不使用任何鎖定。這可以為大量使用 ETS 表格的應用程式提供顯著的效能提升。
自有 ID:OTP-16315
STDLIB 3.10
修正的錯誤和故障
現在,當在大型主體中驗證 utf8 時,
re:run()
會產生結果。自有 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 連接到終端機,這些函式也會傳回{error,enotsup}
,如果從 escript 或使用 (例如)erl -noshell
啟動的程式叫用這些函式的話。自有 ID:OTP-15959 輔助 ID:ERL-717
修正了萬用字元中「..」和「@」的處理方式。「..」僅在前面加上文字模式 (例如「a/..」) 時才能運作,而在前面加上萬用字元 (例如「*/..」) 時則無法運作。「@/..」的組合也中斷了,此外,模式中的「@」可能會降低萬用字元比對的效能。
自有 ID:OTP-15987 輔助 ID:ERL-1029
確保從 Shell 呼叫時,
ets:fun2ms()
可以處理函式標頭中的++/2
。自有 ID:OTP-15992 輔助 ID:PR-2322
改進和新功能
改進了
gen_statem
中逾時的除錯功能。現在,啟動逾時會記錄在sys:log
和sys:trace
中。執行中的逾時會在伺服器當機記錄中顯示,並可透過sys:get_status
查看。由於此系統事件,新增了{start_timer, Action, State}
和{insert_timout, Event, State}
,這可能會讓依賴這些事件格式的工具感到意外。新功能:可以使用
{TimeoutType, update, NewEventContent}
更新執行中逾時的EventContent
。可以使用{TimeoutType, cancel}
取消執行中的逾時,這比使用Time = infinity
更易讀。* 潛在的不相容性 *
自身 ID:OTP-15510
re:run()
現在避免在同一次呼叫中多次驗證主體的 utf8。先前,在傳遞global
選項時,可能會多次執行此驗證。自身 ID:OTP-15831,輔助 ID:ERL-876
已修復啟用
write_concurrency
的 ETSordered_set
表格的效能問題。在此修正之前,內部統計計數器的值沒有限制。這可能導致資料結構有時對使用它的平行處理程序數量變化反應遲緩。自身 ID:OTP-15906
當傳遞長長的 ordsets 列表時,現在
ordsets:union/1
的速度更快了。自身 ID:OTP-15927
unicode:characters_to_binary()
可能會傳回非常小的二進位檔案作為參考計數的堆外二進位檔案。這可能會導致不必要的記憶體使用量過大,以及二進位配置器不必要的負擔。現在,小的二進位檔案一律以堆積二進位檔案的形式傳回。自身 ID:OTP-16002,輔助 ID:ERIERL-366
當在 Erlang 中編寫的腳本 (
escript
) 中使用錯誤的 I/O 伺服器時,會顯示更有意義的錯誤訊息。自身 ID:OTP-16006,輔助 ID:ERL-992
新功能
ets:info(_, binary)
可取得表格保留的所有參考計數二進位檔案的相關資訊。這與process_info(_, binary)
為處理程序傳回的偵錯資訊相同。自身 ID:OTP-16035,輔助 ID:ERIERL-366
修正了有關透過外部格式序列化時編譯比對規格行為的 ETS 文件。
自身 ID:OTP-16038,輔助 ID:PR-2366
STDLIB 3.9.2
已修正的錯誤和故障
修正了使用控制序列
p
或P
格式化詞語,並使用chars_limit
選項限制輸出時,可能會導致迴圈的錯誤。自身 ID:OTP-15875,輔助 ID:ERL-967
STDLIB 3.9.1
已修正的錯誤和故障
修正了使用控制序列
p
或P
格式化二進位檔案,並使用chars_limit
選項限制輸出時,可能會導致失敗的錯誤。自身 ID:OTP-15847,輔助 ID:ERL-957
STDLIB 3.9
已修正的錯誤和故障
修正了
string:lexemes/2
中的錯誤。此錯誤是在最佳化
string
模組中處理深層 Unicode 字元列表時發現的。自身 ID:OTP-15649
已修正
maps
實作中的錯誤,此錯誤可能會導致當機或記憶體使用量不斷成長,直到機器耗盡記憶體。當將包含二進位B1
的新鍵值組以索引鍵K1
插入到具有二進位B2
的索引鍵K2
的映射M
中,且符合以下條件時,可能會發生這種情況:B1 =/= B2
size(B1) >= 4294967296
size(B2) >= 4294967296
size(M) >= 32
(size(B1) rem 4294967296) == (size(B2) rem 4294967296)
B1
和B2
中的前(size(B1) rem 4294967296)
個位元組相同- 在
K1
中將B1
替換為B2
會建立與K2
值相同的詞語
此問題的根本原因在於
maps
實作只雜湊二進位檔案的前(X rem 4294967296)
個位元組,因此不同的二進位檔案可能會取得相同的雜湊值,與雜湊種子無關。自身 ID:OTP-15707
自引入堆疊追蹤變數後,即使無法省略堆疊追蹤變數,Erlang 美觀列印器也會省略例外類別
throw
,這並不是正確的 Erlang 程式碼。修正方法是始終包含例外類別throw
。自身 ID:OTP-15751
record_info/2
是一個需要編譯時已知的文字引數的虛擬函式。因此,以下用法是不合法的:fun record/info/2
。編譯此類程式碼時,編譯器會當機。已更正為發出編譯錯誤。自身 ID:OTP-15760,輔助 ID:ERL-907
改進和新功能
實作了新的
rand
模組演算法exro928ss
(Xoroshiro928**)。它具有非常長的週期和所有輸出位元的良好統計品質,同時速度僅比預設演算法慢約 50%。相同的產生器也用作
rand
模組的新crypto
外掛程式中的長週期計數器,演算法為crypto_aes
。此外掛程式使用 AES-256 來擾亂計數器,以掩蓋任何可偵測的統計異常。擾亂是分塊完成的,並快取這些分塊以取得良好的攤銷速度(約為預設演算法的一半)。自身 ID:OTP-14461,輔助 ID:PR-1857
與伺服器命名和啟動相關的類型已從
gen_statem
中匯出。這些類型為:server_name/0
、server_ref/0
、start_opt/0
、start_ret/0
和enter_loop_opt/0
。自身 ID:OTP-14724,輔助 ID:PR-2056
rand
模組的預設演算法已變更為exsss
(Xorshift116**),它是 Xorshift116 (exsp
) 狀態更新和 David Blackman 和 Sebastiano Vigna 在 2018 年論文「擾亂線性虛擬隨機數字產生器」中的新擾亂器「StarStar」的組合。這種組合不應具有先前預設演算法具有的低位元弱點,代價是速度降低約 10%。請參閱 GitHub pull request #1969。自身 ID:OTP-14731,輔助 ID:PR-1969
儘管已拒絕 GitHub Pull Request #1855,但泛型狀態機行為
gen_statem
已從該請求中獲得程式碼清除和文件改進。自身 ID:OTP-14737,輔助 ID:PR-1855
將 Unicode 規格更新為 11.0 版。
自身 ID:OTP-15111
ETS 選項
write_concurrency
現在也會影響並改進ordered_set
表格的可擴展性。此實作基於稱為爭用調整搜尋樹的資料結構,其中鎖定粒度會調整為應用程式在執行時間中利用的實際並行量。自身 ID:OTP-15128
使用瑣碎的 Erlang 實作最佳化
maps:new/0
,利用不需要動態堆積配置的文字詞語(空的映射)。自身 ID:OTP-15200,輔助 ID:PR-1878
已變更
gen_*
行為,因此如果伺服器啟用透過sys:log/2,3
記錄的最後 N 則訊息,則此記錄會包含在終止報告中。為了實現這一點,已澄清並清除
sys
手冊頁中定義的「系統事件」格式,新增了函式sys:get_log/1
,並棄用了sys:get_debug/3
。由於這些變更,依賴「系統事件」內部未明確記錄格式的程式碼需要進行更正。* 潛在的不相容性 *
自身 ID:OTP-15381
已最佳化
gen_statem
行為引擎迴圈,以獲得更好的效能,尤其是在回呼模組傳回某些動作時,這表示更實際的應用程式比 Echo Benchmark 的效能更好。自身 ID:OTP-15452
不允許將函式規格用於駐留在其他模組中的函式。
* 潛在的不相容性 *
自身 ID:OTP-15563,輔助 ID:ERL-845, OTP-15562
persistent_term
函式put/2
和erase/1
現在會產生結果。自身 ID:OTP-15615
先前,所有 ETS 表格都使用集中式計數器變數來追蹤儲存的項目數和消耗的記憶體量。這些計數器可能會導致擴展性問題(尤其是在大型 NUMA 系統上)。此變更新增了分散式計數器的實作,並修改了 ETS 的實作,以便啟用
write_concurrency
的ordered_set
類型的 ETS 表格使用分散式計數器。實驗顯示,在頻繁的ets:insert/2
和ets:delete/2
呼叫的案例中,此變更大幅提高了啟用write_concurrency
的 ETSordered_set
表格的可擴展性。自身 ID:OTP-15623,輔助 ID:PR-2190
使用
ssh
而非rsh
作為預設遠端殼層。自身 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
在 Erlang Pretty Printer 的函數中新增
quote_singleton_atom_types
選項。將此選項設定為true
會在所有單例原子類型加上引號。專屬 ID:OTP-15756
STDLIB 3.8.2.4
修正錯誤和故障
[re:run(Subject, RE, [unicode])](
re:run/3
) 在Subject
包含非法的 utf8 且RE
以二進位形式傳遞時,傳回nomatch
而不是使用badarg
錯誤例外狀況失敗。已修正此問題,同時修正了re:run()
錯誤案例中的歸約計數。自有 ID:OTP-16553
STDLIB 3.8.2.3
修正錯誤和故障
已在 erl_tar 中消除目錄遍歷漏洞。erl_tar 現在會拒絕提取指向目標提取目錄外部的符號連結,並傳回
{error,{Path,unsafe_symlink}}
。(感謝 Eric Meadows-Jönsson 提供錯誤報告和建議修正。)自有 ID:OTP-16441
STDLIB 3.8.2.2
修正錯誤和故障
修正了使用控制序列
p
或P
格式化詞語,並使用chars_limit
選項限制輸出時,可能會導致迴圈的錯誤。自身 ID:OTP-15875,輔助 ID:ERL-967
STDLIB 3.8.2.1
修正錯誤和故障
修正了使用控制序列
p
或P
格式化二進位檔案,並使用chars_limit
選項限制輸出時,可能會導致失敗的錯誤。自身 ID:OTP-15847,輔助 ID:ERL-957
STDLIB 3.8.2
修正錯誤和故障
修正了 gen_statem 中的一個錯誤,由於不正確地使用非同步計時器取消,內部逾時訊息可能會在高負載期間以 info 的形式到達回呼模組。
專屬 ID:OTP-15295
STDLIB 3.8.1
修正錯誤和故障
修正了以
compressed
標誌開啟檔案時讀取檔案的效能衰退問題。專屬 ID:OTP-15706 輔助 ID:ERIERL-336
STDLIB 3.8
修正錯誤和故障
修正了 Erlang Pretty Printer 中的一個錯誤:長原子名稱與
<<>>
組合可能會導致崩潰。專屬 ID:OTP-15592 輔助 ID:ERL-818
修正了當使用控制序列
p
或P
格式化字元列表,並使用chars_limit
選項限制輸出時,可能導致錯誤結果或不良效能的錯誤。專屬 ID:OTP-15639
改進和新功能
改進了關於安全表格遍歷以及
ordered_set
的部分綁定鍵優化的 ETS 文件。專屬 ID:OTP-15545 輔助 ID:PR-2103、PR-2139
優化
calendar:gregorian_days_to_date/1
。專屬 ID:OTP-15572 輔助 ID:PR-2121
優化函數
calendar:rfc3339_to_system_time()
和calendar:system_time_to_rfc3339()
。專屬 ID:OTP-15630
STDLIB 3.7.1
修正錯誤和故障
優化術語的漂亮列印。較慢的行為是在 Erlang/OTP 20 中引入的。
專屬 ID:OTP-15573 輔助 ID:ERIERL-306
STDLIB 3.7
修正錯誤和故障
在匹配規範中記錄
bit_size
,並允許在ets:fun2ms
中使用。專屬 ID:OTP-15343 輔助 ID:PR-1962
beam_lib
中的beam()
類型定義為module() | file:filename() | binary()
。module/0
具有誤導性。如果 BEAM 檔案位於目前目錄中,則將模組名稱作為原子傳遞才會有效。為了避免混淆,已從類型中刪除
module/0
。這表示對於將原子作為檔名呼叫beam_lib
的程式碼,將會有 Dialyzer 警告,但這些呼叫仍然可以運作。專屬 ID:OTP-15378 輔助 ID:ERL-696
unicode_util
在二進位字串中的某些 emoji 字素群集上崩潰。專屬 ID:OTP-15428 輔助 ID:ERL-777
當使用外部函式時,可能會抑制未使用變數的警告。
專屬 ID:OTP-15437 輔助 ID:ERL-762
修正 lists:member/2 中的縮減計數
專屬 ID:OTP-15474 輔助 ID:ERIERL-229
改進和新功能
指定時,
+{source,Name}
選項現在會覆蓋堆疊追蹤中的實際檔案名稱,而不是僅影響Mod:module_info()
的傳回值。+deterministic
標誌現在也會影響堆疊追蹤,省略除了檔案名稱之外的所有路徑資訊,從而修正了需要確定性路徑的確定性組建的長期問題。專屬 ID:OTP-15245 輔助 ID:ERL-706
列表相減(
--
運算子)現在會在大型輸入上產生正確的結果。專屬 ID:OTP-15371
calendar:system_time_to_rfc3339/1,2
不再從分數中移除尾隨零。專屬 ID:OTP-15464
STDLIB 3.6
修正錯誤和故障
修正了
filename:basedir/2,3
的規範。專屬 ID:OTP-15252 輔助 ID:ERL-667
改進和新功能
如果給定原始檔名(二進位),則讓
dets:open_file()
以badarg
訊息結束。專屬 ID:OTP-15253 輔助 ID:OTP-13229、ERL-55
即使
io
和io_lib
模組中的格式化函數的Format
引數是二進位列表之類的列表,也會接受它。這是在 Erlang/OTP 21.0 之前的情況。專屬 ID:OTP-15304
STDLIB 3.5.1
修正錯誤和故障
修正了當使用控制序列
p
或P
格式化非字元列表,並使用chars_limit
選項限制輸出時,可能導致崩潰的錯誤。專屬 ID:OTP-15159
STDLIB 3.5
修正錯誤和故障
gen_statem
的改進。當使用在狀態進入呼叫中有效但不允許的例外狀況時,原因已從
{bad_action_from_state_function,Action}
變更為{bad_state_enter_action_from_state_function,Action}
。改進了計時器剖析。許多錯誤的逾時元組未正確處理。
文件已更新,尤其是使用者指南,並且從參考手冊到使用者指南的指標更加明顯。
專屬 ID:OTP-14015
已根據檔案和 socket 操作應該能夠傳回的錯誤,更新了
file:posix/0
和inet:posix/0
的類型規格。專屬 ID:OTP-14019 輔助 ID:ERL-550
檔案操作過去接受包含空字元(整數值為零)的 檔名。這導致名稱被截斷,並且在某些情況下,原始操作的引數被混淆。現在拒絕包含空字元的檔名,並會導致原始檔案操作失敗。
此外,環境變數操作過去接受包含空字元(整數值為零)的環境變數的名稱和值。這導致操作靜默產生錯誤的結果。現在拒絕包含空字元的環境變數名稱和值,並會導致環境變數操作失敗。
原始環境變數操作也過去接受環境變數名稱中的
$=
字元,導致各種問題。現在也拒絕環境變數名稱中的$=
字元。erlang:open_port/2
從現在起也將拒絕連接埠名稱中的空字元。* 潛在的不相容性 *
專屬 ID:OTP-14543 輔助 ID:ERL-370
讓
io_lib:unscan_format/1
能夠使用 pad char 和預設精度。專屬 ID:OTP-14958 輔助 ID:PR-1735
控制序列修飾符
t
和l
可以在同一個控制序列中一起使用,這使得可以同時擁有 Unicode 原子,並且不偵測可列印字元列表。專屬 ID:OTP-14971 輔助 ID:PR-1743
修正 Erlang 程式碼檢查工具中的一個錯誤:當使用 map 語法時,guard 運算式的檢查不再回傳
false
。此錯誤影響了 Erlang shell、除錯器和其他評估抽象程式碼的模組。自有 ID:OTP-15035 輔助 ID:ERL-613
類型為 {Fun,State} 的系統除錯函式不應允許重複安裝。然而,如果目前的 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
的 timeout 參數{clean_timeout,infinity}
的語意已變更為使用代理程序進行呼叫。透過此變更,clean_timeout
隱含使用一個沒有例外狀況的代理程序。這可能是一個難以察覺的不相容性:在發生網路問題時,如果捕獲錯誤,延遲的回覆可能會出現在呼叫者的訊息佇列中。此修正後,將不會發生這種情況。timeout 參數
infinity
的語意並未變更。* 潛在的不相容性 *
自有 ID:OTP-13073 輔助 ID:PR-1595
Erlang/OTP 新增了一個新的日誌 API,請參閱
logger
手冊頁面,以及 Kernel 使用者指南中的 日誌 章節。對
error_logger
的呼叫會自動重新導向至新的 API,而舊有的錯誤日誌處理程序仍然可以使用。然而,建議在撰寫新程式碼時直接使用 Logger API。請注意以下潛在的不相容性
核心組態參數
error_logger
仍然有效,但如果預設處理程序的輸出目的地是使用核心組態參數logger
設定的,則會被覆寫。一般來說,用於設定錯誤日誌的參數會被用於設定 Logger 的新參數覆寫。
SASL 錯誤日誌的概念已被棄用,這表示預設情況下,SASL 應用程式不會影響記錄哪些日誌事件。
預設情況下,Supervisor 報告和當機報告會由核心啟動的預設 Logger 處理程序記錄,並與來自 Erlang/OTP 的其他標準日誌事件一起輸出至相同的目的地(終端機或檔案)。
進度報告預設不會記錄,但可以將主要日誌層級設定為 info 來啟用,例如使用核心組態參數
logger_level
。若要取得與早期版本 SASL 錯誤日誌功能的回溯相容性,請將核心組態參數
logger_sasl_compatible
設定為true
。這會防止預設的 Logger 處理程序記錄任何 Supervisor、當機或進度報告。相反地,SASL 會在應用程式啟動期間新增一個單獨的 Logger 處理程序,負責處理這些日誌事件。SASL 組態參數sasl_error_logger
和sasl_errlog_type
會指定這些事件的記錄目的地(終端機或檔案)和嚴重性層級。
由於 Logger 是 Erlang/OTP 21.0 的新功能,我們保留在後續的修補程式中對 Logger API 和功能進行變更的權利。這些變更可能會或可能不會與初始版本向後相容。
* 潛在的不相容性 *
自有 ID:OTP-13295
新增函式
calendar:system_time_to_local_time/2
和calendar:system_time_to_universal_time/2
。自有 ID:OTP-13413
新增函式
rand:uniform_real/0
和rand:uniform_real_s/1
。它們產生在範圍0.0 =< X < 1.0
內均勻分佈的數字,這些數字與正規化 IEEE 754 雙精度允許的隨機實數盡可能接近。由於隨機實數正好為0.0
的機率為無限小,它們永遠不會回傳正好0.0
。當您需要在隨機值
X
上呼叫例如math:log(X)
或1 / X
時,這些屬性非常有用,因為使用這些新函式產生的數字永遠不會失敗。自有 ID:OTP-13764 輔助 ID:PR-1574
新增 maps:iterator/0 和 maps:next/1,用於迭代 map 中的鍵值關聯。
自有 ID:OTP-14012
變更
.erlang
載入的預設行為:不再從目前目錄載入.erlang
。c:erlangrc(PathList)
可用於從使用者指定的目錄中搜尋和載入.erlang
檔案。escript
、erlc
、dialyzer
和typer
完全不再載入.erlang
。* 潛在的不相容性 *
自有 ID:OTP-14439
stdlib 新增新的 uri_string 模組,用於處理 URI (RFC 3986)。
自有 ID:OTP-14496
將 Unicode 規格更新至 10.0 版。
自有 ID:OTP-14503
filelib:wildcard()
現在允許使用反斜線跳脫具有特殊意義的字元。這是一個不相容的變更,但請注意,在萬用字元中使用反斜線在 Windows 和 Unix 上已經會有不同的運作方式。現有對
filelib:wildcard()
的呼叫需要更新。在 Windows 上,目錄分隔符號必須一律寫成斜線。* 潛在的不相容性 *
自有 ID:OTP-14577
Supervisor 現在將其子規範儲存在 map 中,而非清單中。當在非 simple_one_for_one Supervisor 下啟動許多子程序時,這會帶來顯著的效能提升。
自有 ID:OTP-14586
最佳化
base64
模組。請注意,除非以文件化的類型呼叫,否則函式
encode/1
、decode/1
和mime_decode/1
會失敗。它們過去接受任何iodata/0
。自有 ID:OTP-14624 輔助 ID:PR-1565
新增函式
lists:search/2
。自有 ID:OTP-14675 輔助 ID:PR-102
uri_string 模組擴充了用於處理基於 HTML5 規格的 application/x-www-form-urlencoded 查詢字串的函式。
自有 ID:OTP-14747
新增函式
calendar:rfc3339_to_system_time/1,2
和calendar:system_time_to_rfc3339/1,2
。自有 ID:OTP-14764
erl_eval
模組函式回傳的堆疊追蹤更準確地反映了發生例外狀況的位置。自有 ID:OTP-14826 輔助 ID:PR 1540
將選項
atime
、mtime
、ctime
、uid
和gid
新增至erl_tar:add/3,4
函式。自有 ID:OTP-14834 輔助 ID:PR 1608
新增
ets:whereis/1
,用於擷取具名表格的表格識別碼。自有 ID:OTP-14884
改進 uri_string 模組中的 URI 正規化函式。
自有 ID:OTP-14910
新函式
io_lib:fwrite/3
和io_lib:format/3
接受第三個引數,即選項清單。唯一的選項是chars_limit
,用於限制回傳字元的數量。此限制是軟性的,表示回傳字元的數量最多會超過限制一小部分。如果設定了限制,則函式format/3
和fwrite/3
會嘗試將字元的數量均勻分佈在控制序列pPswW
上。此外,控制序列pPwP
會嘗試將字元的數量均勻分佈在子結構上。控制序列
pPwW
的一個修改是,即使回傳字元的數量沒有限制,map 的所有關聯都會列印到相同的深度。目標是提供更一致的輸出,因為 map 鍵的順序未定義。與之前一樣,如果深度小於 map 的關聯數量,則要列印的關聯選擇是任意的。自有 ID:OTP-14983
新增函式
ordsets:is_empty/1
和sets:is_empty/1
。自有 ID:OTP-14996 輔助 ID:ERL-557, PR-1703
改進處理 ASCII 字元時
string:uppercase/1
、string:lowercase/1
和string:casefold/1
的效能。自有 ID:OTP-14998
模組、名稱和算數 (例如
erlang:abs/1
) 具有字面值的外部函式現在被視為字面值。這表示更有效率的程式碼,並在堆積上產生較少的垃圾。自有 ID:OTP-15003
sys:statistics(Pid,get) 未回報來自 gen_server 的 'out' 訊息。此問題已修正。
自有 ID:OTP-15047
系統除錯函式現在除了舊有的 {Fun,State} 格式外,還可以具有 {Id,Fun,State} 格式。這允許安裝多個除錯函式執行個體。
自有 ID:OTP-15048
移除
lib
模組- 移除
lib:error_message/2
。 - 移除
lib:flush_receive/0
。 - 移除
lib:nonl/1
。 lib:progname/0
已被ct:get_progname/0
取代。- 移除
lib:send/2
。 - 移除
lib:sendw/2
。
* 潛在的不相容性 *
自有 ID:OTP-15072 輔助 ID:PR 1786, OTP-15114
- 移除
函式
ets:delete_all_objects/1
現在會針對需要大量時間清除的大型表格產生排程器執行緒。這是為了改善其他可執行程序的即時特性。自有 ID:OTP-15078
在包含
p
或P
的函式io:fwrite/2,3
和io_lib:fwrite/2,3
的控制序列中,欄位寬度值為0
表示不插入換行符號。這與舊行為相反,舊行為中0
會在每個子項之後插入換行符號。若要在每個子項之後插入換行符號,可以使用欄位寬度值1
。* 潛在的不相容性 *
自有 ID:OTP-15103 輔助 ID:ERL-607
STDLIB 3.4.5.1
改進與新功能
列表相減(
--
運算子)現在會在大型輸入上產生正確的結果。專屬 ID:OTP-15371
STDLIB 3.4.5
修正的錯誤與故障
在
gen_statem
中的Module:init/1
函式可能會回傳包含任何動作的動作列表,但錯誤的檢查只允許狀態進入動作,因此例如{next_event,internal,event}
會導致伺服器崩潰。此錯誤已修正。自有 ID:OTP-13995
STDLIB 3.4.4
修正的錯誤與故障
更正
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
修正的錯誤與故障
使
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
修正的錯誤與故障
修正在 Erlang shell 中的一個錯誤,其中具有類型欄位的遞迴定義記錄可能會導致迴圈。
自有 ID:OTP-14488 輔助 ID:PR-1489
使 edlin 處理字素叢集而不是碼點,以改善多碼點字元的處理。
自有 ID:OTP-14542
當使用多個
catch
子句時,可能會對在try
區塊之外使用erlang:get_stacktrace/0
產生錯誤的警告。自有 ID:OTP-14600 輔助 ID:ERL-478
改進與新功能
Erlang 程式碼檢查器不再檢查在
nowarn_deprecated_function
選項中提及的函式是否在模組中宣告。自有 ID:OTP-14378
一般 Unicode 改進。
自有 ID:OTP-14462
STDLIB 3.4.1
修正的錯誤與故障
修正了 Erlang/OTP 20.0 中引入的
proc_lib:format()
中的一個錯誤。自有 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
修正的錯誤與故障
在許多版本中,使用具有相同名稱的本地函式覆蓋 BIF 是合法的。但是,在列表理解中將與 guard BIF 同名的本地函式作為篩選器是不允許的。
自有 ID:OTP-13690
在
rand
模組中實作了一個新的(預設)偽隨機數產生器演算法 Xoroshiro116+。舊的演算法實作存在許多缺陷,因此它們都已棄用,但已新增兩個修正版本。請參閱文件。
自有 ID:OTP-14295 輔助 ID:PR-1372
Erlang shell、
qlc:string_to_handle()
和除錯器(繫結區域的評估器區域和編輯變數視窗)可以剖析 pid、port、參考和外部 fun,只要它們可以在執行中的系統中建立即可。自有 ID:OTP-14296
內部程式碼變更:對
catch
的呼叫,後接對erlang:get_stacktrace/0
的呼叫已重寫為使用try
而不是catch
,以使程式碼具有前瞻性。自有 ID:OTP-14400
由
ets:fun2ms/1
和dbg:fun2ms/1
使用的ms_transform
模組會評估常數算術表達式。這是必要的,因為通常評估常數表達式的 Erlang 編譯器無法識別ms_transform
產生的格式。自有 ID:OTP-14454 輔助 ID:ERIERL-29
狀態機器引擎
gen_statem
現在可以處理通用逾時(多個命名)以及絕對逾時時間。請參閱文件。gen_statem
回呼Module:init/1
已成為強制性的,以與其他gen_*
模組協調一致。對於使用gen_statem:enter_loop/4-6
的gen_statem
回呼模組而言,這可能是不相容的。* 潛在的不相容性 *
自有 ID:OTP-14531
改進與新功能
改善了對字串的 Unicode 支援。
unicode
模組中新增了正規化函式。使用改進的 Unicode 處理方式並在字素叢集上運作的新函式擴展了string
模組 API。新函式在unicode:chardata()
類型上運作,因此它們也接受UTF-8 二進位制
作為輸入。舊的字串 API 已標記為已過時。某些錯誤情況的傳回值已變更。
* 潛在的不相容性 *
自有 ID:OTP-10289 輔助 ID:OTP-10309
有兩個新的 guard BIF '
floor/1
' 和 'ceil/1
'。它們都傳回整數。在 'math
' 模組中,有兩個具有相同名稱的新 BIF 會傳回浮點值。自有 ID:OTP-13692
使程式碼變更、終止和 handle_info 回呼在 OTP 行為中成為可選的。
自有 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
在文件中新增有關達到最大重新啟動頻率時監督者關機原因的資訊。
自有 ID:OTP-14037 輔助 ID:PR-1233
新增
rand:jump/[0|1]
函式。自有 ID:OTP-14038 輔助 ID:PR-1235
新增了用於偵測已變更程式碼的函式。
code:modified_modules/0
會傳回所有目前已載入且在磁碟上已變更的模組。code:module_status/1
會傳回模組的狀態。在 shell 和c
模組中,mm/0
是code:modified_modules/0
的簡寫,而lm/0
會重新載入所有目前已載入且在磁碟上已變更的模組。自有 ID:OTP-14059
現在,
assert.hrl
中的每個 assert 巨集都有一個具有額外引數的對應版本,用於在斷言中新增註解。例如,這些可以作為錯誤報告的一部分列印,以闡明失敗檢查的含義。自有 ID:OTP-14066
error_logger_tty_h
和error_logger_file_h
現在會將非本地訊息的節點資訊插入到訊息本身之前,而不是之後,這是為了提高可讀性,並且不會變更訊息末尾的換行屬性。自有 ID:OTP-14068
Erlang 程式碼檢查器會檢查格式不正確的類型限制。
自有 ID:OTP-14070 輔助 ID:PR-1214
預設情況下,現在使用
export_all
時會發出警告。可以使用nowarn_export_all
停用警告。自有 ID:OTP-14071
當
gen_server
處理程序崩潰時,將會列印用戶端的堆疊追蹤,以方便除錯。自有 ID:OTP-14089
透過將表格識別碼類型從整數變更為參考來最佳化 ETS 操作。參考可以更直接地對應到表格,減少潛在的鎖定爭用,並使表格的建立和刪除具有更好的擴展性。
ETS 表格識別碼的不透明類型變更可能會導致在對此不透明類型做出錯誤假設的程式碼中失敗。
注意
一個 Erlang 節點上儲存的表格數量曾經受到限制。現在已不再如此(除了受記憶體使用量限制)。先前的預設限制約為 1400 個表格,並且可以在啟動 Erlang 執行階段系統之前設定環境變數
ERL_MAX_ETS_TABLES
來增加此限制。此硬性限制已移除,但目前無論如何設定ERL_MAX_ETS_TABLES
仍然很有用。應將其設定為所使用表格的最大約略值。這是因為命名表格的內部表格會使用此值來調整大小。如果使用大量命名表格且尚未增加ERL_MAX_ETS_TABLES
,則命名表格查閱的效能將會降低。* 潛在的不相容性 *
自有 ID:OTP-14094
已將
take/2
新增至dict
、orddict
和gb_trees
。已將take_any/2
新增至gb_trees
。自有 ID:OTP-14102
擴展 gen_event API 以處理選項。
自有 ID:OTP-14123
將有關如何調整監督者重新啟動頻率(強度和週期)的建議新增至系統文件 - 設計原則 - 監督者行為。
自有 ID:OTP-14168 輔助 ID:PR-1289
gen_fsm 已棄用,並由 gen_statem 取代,但是為了向後相容性原因,gen_fsm 可能會在很長一段時間內繼續以未記錄的功能存在。
自有 ID:OTP-14183
shell 函數
c/1
和c/2
已擴展,因此如果參數是模組名稱而不是檔案名稱,它會自動找到 .beam 檔案和對應的原始碼檔案,然後使用相同的編譯器選項(加上傳遞給 c/2 的任何選項)重新編譯模組。如果編譯失敗,則會保留舊的 beam 檔案。此外,還加入了c(Mod, Opts, Filter)
,其中 Filter 參數允許您在新增新選項之前移除舊的編譯器選項。新的實用工具函數
file_find/2/3
和find_source/1/2/3
已新增至filelib
。Own 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 封存檔,以達到最大的可攜性。Own Id: OTP-14226
base64:mime_decode/1
已最佳化,現在幾乎與base64:decode/1
一樣快;以前明顯較慢。Own Id: OTP-14245
現在
erl_tar
從 tar 封存檔解壓縮檔案時,會從路徑名稱中移除任何開頭的 '/
',並將訊息寫入錯誤記錄檔。此外,還有一個新的目錄遍歷攻擊檢查;如果相對路徑指向目前工作目錄的上方,則解壓縮將會中止。Own Id: OTP-14278
由於 atom 包含任意 Unicode 字元,因此進行了各種更新。
Own Id: OTP-14285
Crypto 應用程式現在支援產生密碼學上強大的亂數(小於 1.0 的浮點數和任意範圍的整數),作為 'rand' 模組的外掛程式。
Own Id: OTP-14317 Aux Id: PR-1372
新增函數
ets:select_replace/2
,它使用符合規範來執行 ETS 物件的原子「比較並交換」操作。Own Id: OTP-14319 Aux Id: PR-1076
Erlang 程式碼 linter 會檢查錯誤的
dialyzer
屬性。它還會檢查類型宣告中錯誤的類型變數。Own Id: OTP-14323
在
rand
模組中實作了兩個新函數;normal/2
和normal_s/3
,它們都會根據參數產生具有平均值和變異數的常態分佈(虛擬)亂數。Own Id: OTP-14328 Aux Id: PR-1382
將 OTP 內部 PCRE 函式庫從 8.33 版升級至 8.40 版。此函式庫用於實作
re
正規表示式模組。除了各種錯誤修正外,新版本還可提供更好的堆疊保護。為了利用此功能,現在預設將所有平台上一般排程器執行緒的堆疊大小設定為 128 個千字。一般排程器執行緒的堆疊大小可以在系統啟動時,將
+sss
命令列參數傳遞至erl
命令來設定。如需版本 8.33 和 8.40 之間對 PCRE 所做的變更資訊,請參閱 http://pcre.org/original/changelog.txt。
* 潛在的不相容性 *
Own Id: OTP-14331 Aux Id: ERL-208
新增函數
re:version/0
,它會傳回有關用於實作re
模組的 OTP 內部 PCRE 版本資訊。Own Id: OTP-14347 Aux 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}}
選項的描述。Own Id: OTP-14369 Aux Id: PR-1367
將選項 hibernate_after 新增至 gen_server、gen_statem 和 gen_event。也新增至已棄用的 gen_fsm 行為。
Own Id: OTP-14405
gen_server
、gen_statem
和proc_lib
建立的當機報告大小受到 Kernel 應用程式變數error_logger_format_depth
的限制。目的是為了限制當具有龐大訊息佇列或狀態的程序當機時,傳送至error_logger
程序的訊息大小。proc_lib
產生的當機報告包含新的標記message_queue_len
。相鄰報告也包含新的標記current_stacktrace
。最後,相鄰報告不再包含標記messages
和dictionary
。新的函數
error_logger:get_format_depth/0
可用於擷取 Kernel 應用程式變數error_logger_format_depth
的值。Own Id: OTP-14417
STDLIB 3.3
已修正的錯誤和故障
只有兩行的 escript 無法運作。
Own Id: OTP-14098
字元 (
$char
) 可用於常數模式運算式。它們也可用於類型和合約中。Own Id: OTP-14103 Aux Id: ERL-313
已修正
erl_parse:anno_to_term/1
和erl_parse:anno_from_term/1
的簽章。使用這些函數不再會導致錯誤的 Dialyzer 警告。Own Id: OTP-14131
改進了 map 的美化列印。
Own Id: OTP-14175 Aux Id: seq13277
如果
zip
模組中的任何下列函數當機,則會讓檔案保持開啟:extract()
、unzip()
、create()
或zip()
。此問題已修正。無法解壓縮具有「Unix 標頭」的
zip
檔案。Own Id: OTP-14189 Aux Id: ERL-348, ERL-349
改善 Erlang shell 對長名稱的 Tab 鍵自動完成功能。
Own Id: OTP-14200 Aux Id: ERL-352
sys
的參考手冊中有關在執行階段動態變更模組的程序所使用的 'get_modules' 訊息的一些錯誤資訊。現在已修正此文件。Own Id: OTP-14248 Aux 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 不是強制性的。
Own Id: OTP-14114
已新增
filename:safe_relative_path/1
以清理相對路徑。Own Id: OTP-14215
STDLIB 3.2
已修正的錯誤和故障
當 simple_one_for_one 管理者關閉時,如果子程序以 {shutdown, Term} 形式的結束原因結束,則先前會列印錯誤報告。現在已修正此問題。
Own Id: OTP-13907 Aux Id: PR-1158, ERL-163
允許將空清單做為與
dbg:fun2ms/1
一起使用的 fun 的參數。Own Id: OTP-13974
改進和新功能
使用 3 個新功能改進了新的行為 gen_statem:針對 gen_statem:call/2,3、狀態進入程式碼和狀態逾時使用舊樣式非 Proxy 逾時的可能性。這些都是回溯相容的。已進行微小的程式碼和文件改進,包括對逾時零處理的邊界語義修正。
Own Id: OTP-13929 Aux Id: PR-1170, ERL-284
STDLIB 3.1
已修正的錯誤和故障
已更新
zip:unzip/1,2
和zip:extract/1,2
函數以處理目錄遍歷漏洞。zip 檔案中任何包含指向頂層工作目錄cwd
上方目錄的路徑的元素,都將改為在cwd
中解壓縮。在解壓縮作業期間,會針對 zip 檔案中的任何這類元素列印錯誤訊息。keep_old_files
選項決定檔案是否會覆寫 zip 檔案中先前具有相同名稱的檔案。Own Id: OTP-13633
修正
ets:match_object/1,3
的合約。Own Id: OTP-13721 Aux Id: PR-1113
已修正在 bugs.erlang.org 的 Jira 個案 ERL-172 和 ERL-187 中,關於
gen_statem:code_change/4
的類型規格和 Emacs 範本產生錯誤。Own Id: OTP-13746 Aux Id: ERL-172, ERL-187
改進與新功能
gen_statem 已變更為將伺服器的回呼模式設定為 Module:callback_mode/0 的回傳值。這有助於程式碼降級,因為回呼模式現在變成目前作用中程式碼的屬性,而不是伺服器程序的屬性。
Module:init/1 的例外處理也已改進。
* 潛在的不相容性 *
自有 ID:OTP-13752
STDLIB 3.0.1
修正錯誤與故障
修正 Erlang Shell 中關於類型記錄的錯誤。此錯誤是在 OTP-19.0 中引入的。
自有 ID:OTP-13719 輔助 ID:ERL-182
STDLIB 3.0
修正錯誤與故障
修正影響
dets:open_file/2
的競爭錯誤。自有 ID:OTP-13260 輔助 ID:seq13002
不要搜尋不存在的 Map 鍵兩次
對於
maps:get/2,3
和maps:find/2
,如果在小型 Map 中搜尋立即鍵 (例如 atom),若該鍵不存在,則會執行兩次搜尋。自有 ID:OTP-13459
避免在 Solaris 上出現零星的邊角案例數學錯誤,例如,在不應該發生時,在 exp() 和 pow() 中的下溢會拋出錯誤。
自有 ID:OTP-13531
修正 Map 鍵變數的檢查
Map 鍵不能未綁定,然後用於並行匹配。
範例:
#{ 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
) 可以處理跨越多個 token 的檔名。範例:-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 不會發出警告。同樣地,如果發現記錄結構中
f1
未初始化為某個浮點數,也無法擴充 dialyzer 以發出警告。最後但並非最不重要的一點,當欄位的類型是不透明類型時,在語意上會產生問題:建立不透明類型和結構化類型的聯集對於分析而言非常麻煩,因為這從根本上破壞了該點項目的不透明性。
變更:為了解決這些問題,解析器將不再自動插入
'undefined'
值;相反地,使用者可以選擇此值對 (欄位) 有意義且不適用之處,然後手動插入| 'undefined'
。此變更的後果:此變更表示,對於建立具有未初始化欄位且這些欄位具有與
'undefined'
(例如,float/0
) 不相容的宣告類型之記錄的所有位置,dialyzer 都會發出警告。可以輕鬆地將| 'undefined'
新增至此欄位的類型,來取消此警告。這也新增了使用者確實打算建立此欄位未初始化的記錄的說明文件。* 潛在的不相容性 *
自有 ID:OTP-12719
移除
erl_scan
和erl_parse
模組中已淘汰的函式。自有 ID:OTP-12861
預處理器現在可以展開 ?FUNCTION_NAME 和 ?FUNCTION_ARITY 巨集。
自有 ID:OTP-13059
已實作新的行為
gen_statem
。經過徹底的審查,足以讓至少兩個繁重的 OTP 應用程式使用,並將會保留下來。但是,根據使用者回饋,我們不預期但可能會發現有必要在 OTP-20.0 中進行次要的不回溯相容的變更,因此其狀態可以指定為「並非完全實驗性」...gen_statem
行為旨在取代新程式碼的gen_fsm
。它具有相同的功能,並新增了一些非常有用的功能- 收集狀態程式碼
- 狀態可以是任何項目
- 可以延後事件
- 可以自行產生事件
- 可以從較後狀態傳送回覆
- 可以有多個 sys 可追蹤的回覆
gen_statem
的回呼模型與gen_fsm
的回呼模型不同,但從gen_fsm
重寫為gen_statem
仍然相當容易。自有 ID:OTP-13065 輔助 ID:PR-960
使用原生 BIF 實作來最佳化 binary:split/2 和 binary:split/3。
自有 ID:OTP-13082
背景:自 R12B 起,記錄欄位的類型已由
epp:parse_file()
放入個別的形式,使記錄宣告形式未鍵入。但是,個別的形式不遵循類型宣告的語法,並且檢查-type()
屬性的解析轉換需要知道特殊的語法。由於編譯器會將epp:parse_file()
的傳回值儲存為抽象程式碼區塊中的偵錯資訊 ("Abst"
或abstract_code
),因此如果工具檢查抽象程式碼中的-type()
屬性,也需要知道特殊的語法。變更:
epp:parse_file()
不會建立個別的類型形式,但類型資訊會保留在記錄欄位中。這表示所有解析轉換和所有檢查-record()
宣告的工具都需要識別{typed_record_field, Field, Type}
。* 潛在的不相容性 *
自有 ID:OTP-13148
現在禁止在二進位產生器中使用類型
bytes
的無大小欄位。(其他寫入無大小欄位的方式,例如binary
,已經被禁止。)自有 ID:OTP-13152
類型
map/0
是內建的,無法重新定義。自有 ID:OTP-13153
如果給定原始檔名(二進位),則讓
dets:open_file()
以badarg
訊息結束。自有 ID:OTP-13229 輔助 ID:ERL-55
新增
filename:basedir/2,3
basedir 會針對「user_cache」、「user_config」、「user_data」、「user_log」、「site_config」和「site_data」傳回適當的路徑。在 Linux 和類似 Linux 的系統上,路徑會遵循 XDG 環境變數。
自有 ID:OTP-13392
有新的預處理器指示詞
-error(Term)
和-warning(Term)
,分別導致編譯錯誤或編譯警告。自有 ID:OTP-13476
藉由使用單一傳遞來建立新的清單,同時檢查正確性,最佳化
'++'
運算子和lists:append/2
。自有 ID:OTP-13487
新增
maps:update_with/3,4
和maps:take/2
自有 ID:OTP-13522 輔助 ID:PR-1025
已新增
lists:join/2
。類似於string:join/2
,但適用於任意清單。自有 ID:OTP-13523
混淆斷言以讓 Dialyzer 停止顯示。
自有 ID:OTP-13524 輔助 ID:PR-1002
現在,Supervisors 會在 sys:get_status/1,2 的傳回值中明確新增其回呼模組。這是為了簡化自訂 supervisor 實作。supervisor 的 sys:get_status/1,2 傳回值的 Misc 部分現在是
[{data, [{"State", State}]},{supervisor,[{"Callback",Module}]}]
* 潛在的不相容性 *
自有 ID:OTP-13619 輔助 ID:PR-1000
放寬
proc_lib
中初始呼叫的轉換,也就是說,移除僅對gen_server
和gen_fsm
執行轉換的限制。這讓使用者定義的基於gen
的通用回呼模組可以在c:i()
和觀察器中正常顯示。自有 ID:OTP-13623
函式
queue:lait/1
(liat/1
的拼寫錯誤) 現在已淘汰。自有 ID:OTP-13658
STDLIB 2.8.0.1
改進與新功能
列表相減(
--
運算子)現在會在大型輸入上產生正確的結果。專屬 ID:OTP-15371
STDLIB 2.8
修正錯誤與故障
修正直譯器中綁定的 Map 鍵變數比對的評估。
在此修補程式之前,以下程式碼不會評估:
X = key,(fun(#{X := value}) -> true end)(#{X => value})
自有 ID:OTP-13218
修正
erl_eval
未使用非本機函式處理常式。自有 ID:OTP-13228 輔助 ID:ERL-32
如果存在
-deprecated()
屬性但沒有-module()
宣告,Erlang 程式碼檢查器不再當機。自有 ID:OTP-13230 輔助 ID:ERL-62
由於 OTP 18.0 中時間 API 的重寫,導致
dets:info(Tab, safe_fixed)
返回結果中的時間戳被意外地損壞。此問題現已修復。問題編號:OTP-13239 輔助編號:OTP-11997
已消除
beam_lib
在使用加密抽象格式時,罕見的競爭條件。問題編號:OTP-13278
改進了 maps:with/2 和 maps:without/2 演算法。
新的實作顯著加快了所有輸入大小的執行速度。
問題編號:OTP-13376
改進與新功能
改進了時間扭曲安全性。
在追蹤、循序追蹤和系統分析功能中,引入了
monotonic_timestamp
和strict_monotonic_timestamp
選項。這是因為現有的timestamp
選項不具備時間扭曲安全性。在
ets:info/2
和dets:info/2
中,引入了safe_fixed_monotonic_time
選項。這是因為現有的safe_fixed
選項不具備時間扭曲安全性。問題編號:OTP-13222 輔助編號:OTP-11997
在 Shell 中,Ctrl+W(刪除單字)將不再把 "." 視為單字的一部分。
問題編號:OTP-13281
STDLIB 2.7
已修復的錯誤和故障
Erlang Pretty Printer 使用
::
來表示函式類型約束。修復了在 map pair 類型中,pretty printing 註釋類型聯集元素的錯誤。
修正了關於類型和規格文件的一些小問題。
問題編號:OTP-13084
如果列表的 pretty printing 設定為
false
,則 shell 命令rp
會將字串列印為整數列表。問題編號:OTP-13145
如果給出具有衝突類型的位元語法表達式(例如,如果欄位類型給定為 '
integer-binary
'),則 shell 會崩潰。(感謝 Aleksei Magusev 回報此錯誤。)問題編號:OTP-13157
rand:export_seed/0
即使之前沒有建立 seed 也永遠不會返回 'undefined
'。已修復為如果程序字典中沒有 seed,則返回 'undefined
'。問題編號:OTP-13162
改進與新功能
在 Erlang shell 中新增對 Delete、Home 和 End 鍵的支援。
問題編號:OTP-13032
已將
beam_lib:all_chunks/1
和beam_lib:build_module/1
記錄在文件中。問題編號:OTP-13063
STDLIB 2.6
已修復的錯誤和故障
在 OTP 18.0 中,
qlc
無法很好地處理語法錯誤。此錯誤已修復。問題編號:OTP-12946
優化當解壓縮到記憶體時的 zip:unzip/2。
問題編號:OTP-12950
更新了 STDLIB 參考手冊,以顯示有關
gen_fsm:reply/2
的回傳值的正確資訊。問題編號:OTP-12973
re:split2,3 和 re:replace/3,4 現在可以正確處理使用 '
unicode
' 選項編譯的預編譯模式。問題編號:OTP-12977
匯出文件中的
shell:catch_exception/1
。問題編號:OTP-12990
改進與新功能
引入了一種機制,用於限制內建錯誤記錄器事件產生的文字量。它有助於限制日誌檔案的大小和用於產生它們的 CPU 時間。
此機制是實驗性的,因為如果發現它無法解決應該解決的問題,則可能會進行變更。在這種情況下,此機制可能會進行不向後相容的改進。
請參閱 Kernel 應用程式中 config 參數
error_logger_format_depth
的文件,以了解如何開啟此功能。問題編號:OTP-12864
STDLIB 2.5
已修復的錯誤和故障
修復 filename:join/2 中對單個點的處理
參考手冊說明 filename:join(A,B) 等同於 filename:join([A,B])。在某些罕見的情況下,這被證明是不正確的。例如
filename:join("/a/.","b") -> "/a/./b"
vsfilename:join(["/a/.","b"]) -> "/a/b"
。此問題已修正。現在,只有在結果路徑的開頭或結尾出現單個點時才會保留它。
* 潛在的不相容性 *
問題編號:OTP-12158
已移除
gen_server
中未記錄的選項generic_debug
。問題編號:OTP-12183
已重寫 erl_lint:icrt_export/4,使程式碼真正遵循 Erlang 的範圍規則,而不是僅在大多數情況下意外地遵循。
問題編號:OTP-12186
將 'trim_all' 選項新增至 binary:split/3
可以設定此選項來刪除呼叫 binary:split/3 結果中_所有_空白部分。
問題編號:OTP-12301
修正了 orddict(3) 關於
fold()
和map/0
評估順序的問題。問題編號:OTP-12651 輔助編號:seq12832
修正
maps
模組錯誤例外狀況現在,對 maps 模組函式的錯誤輸入將會產生以下例外狀況
- {badmap, NotMap},或
- badarg。
問題編號:OTP-12657
現在可以在 JCL 模式下(使用 Ctrl-Y)貼上先前 shell 會期中複製的文字。同時,修復了在貼上文字時導致 JCL 模式崩潰的錯誤。
問題編號:OTP-12673
新增
uptime()
shell 命令。問題編號:OTP-12752
在 erl_lint 中快取 nowarn_bif_clash 函式。
此修補程式將 nowarn_bif_clash 儲存在 lint 記錄中。透過在編譯 erlang parser 時使用 erlc +'{eprof,lint_module}',我們注意到在 nowarn_function/2 上花費的時間從 30% 減少到 0.01%。
問題編號:OTP-12754
透過使用快取的檔案名稱資訊來優化 Erlang 程式碼靜態檢查器。
問題編號:OTP-12772
如果 simple_one_for_one 的子程序從其啟動函式返回 ignore,則不再針對任何重新啟動類型儲存該子程序。由於 supervisor 是 simple_one_for_one,因此無法重新啟動或刪除該子程序。
問題編號:OTP-12793
使
ets:file2tab
保留表格的已啟用read_concurrency
和write_concurrency
選項。問題編號:OTP-12814
在許多情況下,使用者程式碼需要能夠區分正常關閉的 socket 和中止的 socket。設定 {show_econnreset, true} 選項可讓使用者在主動和被動 socket 上收到 ECONNRESET 錯誤。
問題編號:OTP-12841
改進與新功能
允許使用 map 作為 supervisor 標誌和子程序規格
之前,supervisor 標誌和子程序規格是作為 tuple 給定的。儘管為了向後相容性而保留了此方式,但現在也允許將這些參數作為 map 給定,請參閱 sup_flags 和 child_spec。
問題編號: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
(新增)
問題編號:OTP-11173 輔助編號:seq12353
移除
pg
模組,該模組已透過 OTP-17 棄用,現在已從 STDLIB 應用程式中移除。該模組已被標記為實驗性 15 年以上,並且很大程度上已被 Kernel 應用程式中的pg2
模組取代。問題編號:OTP-11907
新 BIF:
erlang:get_keys/0
,列出與程序字典相關聯的所有索引鍵。注意:erlang:get_keys/0
為自動匯入。* 潛在的不相容性 *
問題編號:OTP-12151 輔助編號:seq12521
將三個新函式新增至
io_lib
--scan_format/2
、unscan_format/1
和build_text/1
-- 它們公開格式控制序列的已剖析形式,以便輕鬆修改或篩選io_lib:format/2
的輸入。例如,這可以用來在執行實際格式化之前,將諸如~w
或~p
之類的無界大小控制序列替換為對應的深度限制~W
和~P
。問題編號:OTP-12167
引入
erl_anno
模組,它是抽象格式中 token 和 tuple 的第二個元素的抽象。問題編號:OTP-12195
在表達式和模式中,支援變數作為 Map 的索引鍵
Erlang 將接受任何表達式作為 Map 表達式中的索引鍵,並且在 Map 模式中接受文字或綁定變數作為索引鍵。
問題編號:OTP-12218
已移除 Mnemosyne 規則的最後痕跡。
問題編號:OTP-12257
在 match_specs 中正確支援 map
問題編號:OTP-12270
新函式
ets:take/2
。其工作方式與ets:delete/2
相同,但也返回已刪除的物件。問題編號:OTP-12309
string:tokens/2
速度稍快,尤其是當分隔符號列表僅包含一個分隔符號字元時。問題編號:OTP-12422 輔助編號:seq12774
已使用類型和規格更新抽象格式的文件 (在 ERTS 使用者指南中)。(感謝 Anthony Ramine。)
已移除抽象格式類型中使用的括號的明確表示法。相反,新的函式
erl_parse:type_inop_prec()
和erl_parse:type_preop_prec()
可以用在需要的地方插入括號。問題編號:OTP-12492
防止 zip:zip_open/[12] 在父程序死亡時洩漏檔案描述器。
問題編號:OTP-12566
新增新的亂數產生器,請參閱
rand
模組。它具有更好的特性和改進的介面。問題編號:OTP-12586 輔助編號:OTP-12501、OTP-12502
當給定空二進位制時,
filename:split/1
現在將會返回一個空列表,使其與給定空列表時的傳回值一致。問題編號:OTP-12716
將
sync
選項新增至ets:tab2file/3
。問題編號:OTP-12737 輔助編號:seq12805
新增函式
gb_sets:iterator_from()
和gb_trees:iterator_from()
。(感謝 Kirill Kinduk。)問題編號:OTP-12742
在 maps 模組中新增
maps:filter/2
函式。專案編號:OTP-12745
變更一些內部資料結構為 Maps,以加快編譯時間。測得的加速約為 10%-15%。
專案編號:OTP-12774
更新
orddict
以使用參數化型別和規格。(感謝 UENISHI Kota。)專案編號:OTP-12785
eunit
中的斷言巨集已移至stdlib/include/assert.hrl
。這個檔案會被eunit.hrl
包含。因此,對 eunit 使用者來說沒有任何改變,但現在也可以單獨包含這些斷言。專案編號:OTP-12808
STDLIB 2.4
修正的錯誤與故障
字元類型 \d、\w 和 \s 的行為一直是不匹配值大於 255 的字元,而不是 128,也就是說它們僅限於 ISO-Latin-1 而不是 ASCII
專案編號:OTP-12521
改進與新功能
c:m/1 現在會顯示模組的 MD5 總和。
專案編號:OTP-12500
使 ets:i/1 處理來自 IO 伺服器的二進位輸入。
專案編號:OTP-12550
STDLIB 2.3
修正的錯誤與故障
string:tokens/2 的文件現在明確指出,相鄰的分隔符號字元不會在產生的符號列表中產生任何空字串。
專案編號:OTP-12036
修正 ssh 應用程式中損壞的棄用警告
專案編號:OTP-12187
Maps:正確對齊文件中 union 型別的 assoc 值
專案編號:OTP-12190
修正在 'Cwd' 以點結尾時 filelib:wildcard/2 的錯誤
專案編號:OTP-12212
允許屬性內的 maps 值使用
Name/Arity
語法。專案編號:OTP-12213
修正 edlin 以正確儲存使用 ctrl-u 刪除的文字。在此修正之前,在 Erlang shell 中輸入文字,然後使用 ctrl-u 刪除,接著使用 ctrl-y 將其重新貼上,會導致貼上的文字與原始刪除的文字相反。
專案編號:OTP-12224
如果回呼函式因 exit/1 而終止,則 gen_server 產生的錯誤報告中將不會有堆疊追蹤。此問題已修正。
為了保持向後相容性,處理程序的實際結束原因不會改變。
專案編號:OTP-12263,輔助編號:seq12733
ms_transform
產生的警告可能會指出錯誤的行號。專案編號:OTP-12264
改進與新功能
支援在本地電腦上掛載的檔案系統以外的其他媒體上建立 tar 檔案。
erl_tar
api 擴展了erl_tar:init/3
,可讓您使用使用者提供的媒體儲存常式。一組 ssh 特定常式隱藏在新的函式ssh_sftp:open_tar/3
中,以簡化在遠端 ssh 伺服器上建立 tar 檔案。將分塊檔案讀取選項新增至
erl_tar:add/3,4
,以節省記憶體,例如在小型嵌入式系統上。在這種情況下,可以指定從檔案讀取的切片大小。專案編號:OTP-12180,輔助編號:seq12715
針對呼叫程序中的長訊息佇列最佳化 I/O 請求。
專案編號:OTP-12315
STDLIB 2.2
修正的錯誤與故障
sys:handle_debug/4 的 FormFunc 引數的類型規格錯誤地指向 dbg_fun()。現在已修正,新類型是 format_fun()。
專案編號:OTP-11800
gen_fsm 和 gen_server 等行為應在將狀態列印到記錄之前,始終呼叫 format_status/2。
專案編號:OTP-11967
dets:insert_new/2
的文件已修正。(感謝 Alexei Sholik 回報此錯誤。)專案編號:OTP-12024
使用 io_lib:format 和控制序列 w、精確度 P 和欄位寬度 F 列印詞彙,其中 F< P 將會以以下兩種方式之一失敗
如果 P < 詞彙的列印長度,將會進入無限迴圈,消耗所有可用記憶體。
如果 P >= 詞彙的列印長度,將會引發例外狀況。
這兩個問題現在已修正。
專案編號:OTP-12041
maps:values/1
的文件已修正。專案編號:OTP-12055
在 map 表達式中展開 shell 函式。
專案編號:OTP-12063
改進與新功能
新增 maps:with/2
專案編號:OTP-12137
STDLIB 2.1.1
修正的錯誤與故障
OTP-11850 修正了 filelib:wildcard/1 以與損壞的符號連結一起運作。然而,此修正引入了問題,因為符號連結不再被 filelib:ensure_dir/1、filelib:is_dir/1、filelib:file_size/1 等函式跟隨。現在已修正此問題。
專案編號:OTP-12054,輔助編號:seq12660
STDLIB 2.1
修正的錯誤與故障
如果 "broken_symlink" 是不指向現有檔案的符號連結,則
filelib:wildcard("broken_symlink")
會傳回空清單。專案編號:OTP-11850,輔助編號:seq12571
erl_tar
現在可以處理包含 Unicode 字元的檔案名稱。請參閱erl_tar
文件中的「UNICODE SUPPORT」。建立 tar 檔案時,
erl_tar
有時會寫入過短的帶尾標記。GNU tar 會正確地從此類 tar 檔案中解壓縮檔案,但會抱怨「在 ... 有單獨的零區塊」。專案編號:OTP-11854
當重新定義並匯出類型
map/0
時,Erlang 程式碼靜態分析器 (erl_lint
) 會錯誤地發出錯誤。此錯誤已修正。專案編號:OTP-11872
修正在偵錯工具和 erl_eval 中 map 更新的評估
回報者:José Valim
專案編號:OTP-11922
改進與新功能
下列原生函式現在會在縮減量耗盡時,增加適當的縮減量並讓出執行權
erlang:binary_to_list/1
erlang:binary_to_list/3
erlang:bitstring_to_list/1
erlang:list_to_binary/1
erlang:iolist_to_binary/1
erlang:list_to_bitstring/1
binary:list_to_bin/1
特性影響
效能 - 從清單轉換的函式對於非常小的清單有效能損失,對於非常大的清單則有效能提升。
優先順序 - 以前執行這些函式之一的程序實際上會獲得不公平的優先順序提升。這種優先順序提升取決於輸入大小。輸入越大,優先順序提升就越大。這種不公平的優先順序提升現在已取消。
專案編號:OTP-11888
在 maps 模組中新增
maps:get/3
函式。如果 map 中不存在索引鍵,則該函式會傳回提供的預設值。專案編號:OTP-11951
STDLIB 2.0
修正的錯誤與故障
選項 dupnames 在 re 中無法如預期運作。當尋找具有 {capture, [Name, ...]} 的名稱時,re:run 傳回該名稱符合的隨機實例,而不是文件所述的最左側符合實例。現在已修正此問題,以符合文件。也新增了選項 {capture,all_names} 和 re:inspect/2 函式,以進一步協助使用命名子模式。
專案編號:OTP-11205
如果為 standard_input 設定了選項 'binary',則如果輸出超過一頁長度,則 c:i() 會掛起 - 也就是說,在 "(c)ontinue (q)uit -->" 之後的輸入將無法讀取。此問題已修正。(感謝 José Valim)
專案編號:OTP-11589
stdlib/lists:新增函式 droplast/1。此函式會捨棄非空清單的最後一個元素。lists:last/1 和 lists:droplast/1 是 hd/1 和 tl/1 的對偶,但適用於清單的結尾。(感謝 Hans Svensson)
專案編號:OTP-11677
允許一次性抑制所有自動匯入。導入 no_auto_import 屬性:-compile(no_auto_import)。對於總是使用限定函式名稱並希望避免自動匯入的函式與本地函式衝突的程式碼產生工具非常有用。(感謝 José Valim。)
專案編號:OTP-11682
supervisor_bridge 不再報告子處理程序的正常終止。原因是在某些情況下,例如當重新啟動策略為 simple_one_for_one 時,記錄可能會完全被有關正常終止程序的報告所淹沒。(感謝 Artem Ocheredko)
專案編號:OTP-11685
supervisor 模組中,使用 {via, Module, Name} 語法進行替代註冊的 sup_name() 和 sup_ref() 的類型註解現在與文件一致。Dialyzer 不再抱怨有效的 supervisor:start_link() 和 supervisor:start_child() 呼叫。(感謝 Caleb Helbling。)
專案編號:OTP-11707
已修正兩個 Dets 錯誤。當嘗試開啟一個不是 Dets 檔案的短檔案時,即使只有讀取權限,也會刪除該檔案。使用不是 Dets 檔案的檔案呼叫
dets:is_dets_file/1
時,會保持開啟檔案描述符。(感謝 Håkan Mattsson 回報此錯誤。)專案編號:OTP-11709
修正
ets:all
中的競爭錯誤。同時建立表格可能會導致其他表格不包含在結果中。(感謝 Florian Schintke 回報此錯誤)專案編號:OTP-11726
erl_eval 現在會在 guard 中使用時正確評估 '=='/2。(感謝 José Valim)
專案編號:OTP-11747
io_lib_pretty 中的 proplists:get_value/3 呼叫已替換為更快的 lists:keyfind/3。清單中的元素始終是 2 元組。(感謝 Andrew Thompson)
專案編號:OTP-11752
已修正 qlc 錯誤,其中篩選器被錯誤地最佳化掉。感謝 Sam Bobroff 回報此錯誤。
專案編號:OTP-11758
Ulf Norell 回報並由 Anthony Ramine 修正了許多編譯器錯誤,在這些錯誤中,不尋常或毫無意義的程式碼會導致編譯器崩潰。
專案編號:OTP-11770
自 Erlang/OTP R16B 以來,Erlang 核心靜態分析器 (
erl_lint
) 在重新定義內建類型時,並未發出錯誤。此錯誤已修正。(感謝 Roberto Aloi。)專案編號:OTP-11772
函數
sys:get_state/1,2
和sys:replace_state/2,3
已修正,使其現在可以在程序被 sys 暫停時執行。為了實現這一點,新增了新的回呼函式Mod:system_get_state/1
和Mod:system_replace_state/2
,它們也由通用行為gen_server
、gen_event
和gen_fsm
實作。潛在的不相容性指的是
- 先前攔截系統訊息並將大小為 2 的元組作為最後一個參數傳遞給
sys:handle_system_msg/6
的行為不再支援。 - 當
sys:replace_state/2,3
中的StateFun
失敗時,錯誤處理已從完全靜默更改為可能會(如果回呼模組未捕獲)在客戶端程序中拋出例外。
(感謝 James Fish 和 Steve Vinoski)
* 潛在的不相容性 *
自有 ID:OTP-11817
- 先前攔截系統訊息並將大小為 2 的元組作為最後一個參數傳遞給
改進和新功能
選項 match_limit 和 match_limit_recursion 已新增至 re:run。選項 report_errors 也已新增,以便在 re:run 因限制或編譯錯誤而失敗時取得更多資訊。
自有 ID:OTP-10285
預先定義的類型
array/0
、dict/0
、digraph/0
、gb_set/0
、gb_tree/0
、queue/0
、set/0
和tid/0
已被棄用。它們將在 Erlang/OTP 18.0 中移除。取而代之的是,可以使用類型
array:array/0
、dict:dict/0
、digraph:graph/0
、gb_set:set/0
、gb_tree:tree/0
、queue:queue/0
、sets:set/0
和ets:tid/0
。(注意:一直以來都必須使用ets:tid/0
。)在 Erlang/OTP 17.0 中,允許在本地重新定義類型
array/0
、dict/0
等等。已新增新類型
array:array/1
、dict:dict/2
、gb_sets:set/1
、gb_trees:tree/2
、queue:queue/1
和sets:set/1
。已引入編譯器選項
nowarn_deprecated_type
。藉由包含屬性-compile(nowarn_deprecated_type).
在 Erlang 原始程式檔中,可以避免在 Erlang/OTP 17.0 中出現關於已棄用類型的警告。
該選項也可以作為編譯器標誌給定
erlc +nowarn_deprecated_type file.erl
自有 ID:OTP-10342
對 erlang:open_port/2 使用 'spawn' 的呼叫已更新,以處理命令路徑中的空格。
自有 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 字元屬性支援。與 PCRE 8.33 相關的新選項也已新增至 re 模組(ucd、notempty_atstart、no_start_optimize)。PCRE 在 7.6 和 8.33 之間擴展了正規表示式語法,這就是為什麼這會造成潛在的不相容性。只有非常複雜的正規表示式可能會受到影響,但如果您知道您正在使用晦澀的功能,請測試執行您的正規表示式並驗證它們的行為沒有改變。
* 潛在的不相容性 *
自有 ID:OTP-11204
已新增 dict:is_empty/1 和 orddict:is_empty/1。(感謝 Magnus Henoch。)
自有 ID:OTP-11353
對
garbage_collect/1
BIF 或check_process_code/2
BIF 的呼叫可能會觸發對呼叫 BIF 的程序以外的其他程序進行垃圾收集。先前的實作執行這些垃圾收集時,沒有考慮正在進行垃圾收集的程序的內部狀態。為了能夠更輕鬆且更有效率地實作產生原生程式碼,這些類型的垃圾收集已重寫。現在,像這樣的垃圾收集是由非同步請求訊號觸發,實際的垃圾收集由正在進行垃圾收集的程序本身執行,並由對發出請求的程序的回覆訊號完成。使用這種方法,程序可以停用垃圾收集並產生,而無需將堆積設定為可以進行垃圾收集的狀態。已引入
garbage_collect/2
和check_process_code/3
BIF。兩者都將選項列表作為最後一個參數。使用這些,可以發出非同步請求。code:purge/1
和code:soft_purge/1
已重寫,以利用非同步check_process_code
請求來平行處理工作。特性影響:對
garbage_collect/1
BIF 或check_process_code/2
BIF 的呼叫通常需要更長的時間才能完成,而整個系統不會像以前那樣受到操作的負面影響。對code:purge/1
和code:soft_purge/1
的呼叫可能會更快或更慢地完成,具體取決於系統的狀態,而整個系統不會像以前那樣受到操作的負面影響。自有 ID:OTP-11388 輔助 ID:OTP-11535、OTP-11648
改進主管的
via
參考的說明文件。(感謝 MaximMinin。)自有 ID:OTP-11399
orddict:from_list/1
現在使用lists
模組中最佳化的排序常式,而不是(基本上)插入排序。根據輸入資料,新的from_list/1
的速度從略快到比舊的from_list/1
快幾個數量級。(感謝 Steve Vinoski。)
自有 ID:OTP-11552
EEP43:新資料類型 - 映射
使用映射,您可以例如
____ -
M0 = #{ a => 1, b => 2}, % 建立關聯
____ -
M1 = M0#{ a := 10 }, % 更新值
____ -
M2 = M1#{ "hi" => "hello"}, % 新增關聯
____ -
#{ "hi" := V1, a := V2, b := V3} = M2. % 將鍵與值匹配
如需如何使用映射的資訊,請參閱參考手冊中的映射表示式。
目前的實作不包含以下功能
____ - 沒有變數鍵
____ - 沒有單一值存取
____ - 沒有映射理解
請注意,映射在 OTP 17.0 期間是實驗性的。
自有 ID:OTP-11616
當使用 Tab 鍵完成時,Erlang Shell 現在會將零元函數一直擴展到右括號,除非有另一個具有相同名稱和不同元數的函數。(感謝 Pierre Fenoll。)
自有 ID:OTP-11684
Erlang 程式碼預處理器 (
epp
) 在包含的檔案中遇到循環巨集定義時可能會循環。此錯誤已修正。感謝 Maruthavanan Subbarayan 回報此錯誤,並感謝 Richard Carlsson 提供錯誤修正。
自有 ID:OTP-11728
自 Erlang/OTP R13B 以來,Erlang 程式碼檢查器 (
erl_lint
) 每當重新定義任何類型arity/0
、bitstring/0
、iodata/0
或boolean/0
時,都會發出警告。現在改為發出錯誤。* 潛在的不相容性 *
自有 ID:OTP-11771
erl_parse:abstract/2
的encoding
選項已擴展為包含none
和回呼函數(述詞)。自有 ID:OTP-11807
匯出 zip 選項類型,以允許從其他模組參照。
感謝 Pierre Fenoll 和 Håkan Mattson
自有 ID:OTP-11828
模組
pg
已被棄用,並將在 Erlang/OTP 18 中移除。自有 ID:OTP-11840
STDLIB 1.19.4
已修正的錯誤和故障
修正 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
已修正的錯誤和故障
函數
dets:foldl/3
、dets:foldr/3
和dets:traverse/2
在遍歷表格到結尾後,沒有釋放表格。此錯誤是在 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
已修正的錯誤與故障
Erlang 掃描器不再接受輸入字串中的浮點數。
內部 ID:OTP-10990
當使用 unicode:characters_to_list 將錯誤的二進制資料轉換為列表時,錯誤的回傳值可能包含錯誤的「剩餘部分」,也就是說,無法轉換的字元 io_list 是錯誤的。只有在輸入是子二進制資料且轉換來自 utf8 時才會發生這種情況。現在已修正此問題。
內部 ID:OTP-11080
在 Erlang Pretty Printer
erl_pp
中,類型hook_function()
已被修正。無效形式的列印(例如記錄欄位類型)也已修正。自 R16B 以來一直存在問題。
(感謝 Tomáš Janoušek。)
內部 ID:OTP-11100
修正 erl_eval 中對 BEAM 模組的 receive 支援。感謝 Anthony Ramine。
內部 ID:OTP-11137
改進與新功能
刪除關於簡單一對一監管器的過時註解。感謝 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
已修正的錯誤與故障
已修正
erl_eval
模組中與 Unicode 相關的錯誤。內部 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 中的錯誤處理,如果在 init 中產生的程序死亡,則可能會掛起。
內部 ID:OTP-9803 輔助 ID:kunagi-209 [120]
允許 filelib:wildcard 中使用 **
兩個相鄰的 * 用作單一模式將比對所有檔案和零個或多個目錄和子目錄。(感謝 José Valim)
內部 ID:OTP-10431
在 re:replace/3,4 中新增 \gN 和 \g{N} 語法以用於反向參考,以允許與數字取代字串一起使用。(感謝 Vance Shipley)
內部 ID:OTP-10455
匯出 ets:match_pattern/0 類型(感謝 Joseph Wayne Norton)
內部 ID:OTP-10472
修正使用 ~W 在深度 1 列印空二進制資料的問題(感謝 Andrew Thompson)
內部 ID:OTP-10504
base64
模組中的類型ascii_string()
已被修正。類型file:file_info()
已被清除。類型file:fd()
在文件中已設為不透明。內部 ID:OTP-10624 輔助 ID:kunagi-352 [263]
改進與新功能
在使用繫結鍵遍歷時(僅比對具有正確鍵的物件時),Dets 表格不再是固定的。此最佳化會影響函數
match/2
、match_object/2
、select/2
、match_delete/2
和select_delete/2
。內部 ID:OTP-10097
已實作 Unicode 支援。
內部 ID:OTP-10302
linter 現在會警告未匯出的不透明類型,以及未充分指定的不透明類型。
內部 ID:OTP-10436
在
filename
模組中的下列函數中,類型file:name()
已取代類型file:filename()
:absname/2
、absname_join/2
、join/1,2
和split/1
。內部 ID:OTP-10474
如果子程序在其啟動函數中失敗,則先前的錯誤原因僅作為錯誤處理程序的錯誤報告回報,並且 supervisor:start_link 只會傳回
{error,shutdown}
。此行為已變更,因此監管器現在將傳回{error,{shutdown,Reason}}
,其中Reason
會識別失敗的子程序及其錯誤原因。(感謝 Tomas Pihl)* 潛在的不相容性 *
內部 ID:OTP-10490
在必要時,已在 Erlang 檔案中新增說明編碼的註解。當 UTF-8 成為預設編碼時,註解會在 Erlang/OTP R17B 中移除。
內部 ID:OTP-10630
模組
erl_scan
和sys
的合約和類型已修正並改進。(感謝 Kostis Sagonas。)內部 ID:OTP-10658
當 Erlang shell 遇到 Erlang 掃描器錯誤時,現在會跳過該行的其餘部分。
內部 ID:OTP-10659
清除 proplists 模組中的一些規格。(感謝 Kostis Sagonas。)
內部 ID:OTP-10663
修正了一些超出 PDF 頁面寬度的範例。
內部 ID:OTP-10665
啟用 escript 在指令碼檔案沒有 shebang 時接受模擬器引數。感謝 Magnus Henoch
內部 ID:OTP-10691
修正 queue:out/1、queue:out_r/1 中的錯誤,在最差情況下會使其 O(N^2)。感謝 Aleksandr Erofeev。
內部 ID:OTP-10722
epp
模組中有新的函數可從檔案讀取字元編碼。請參閱epp
以取得更多資訊。內部 ID:OTP-10742 輔助 ID:OTP-10302
已針對 Unicode 調整
io_lib
中的函數。現有的函數write_string()
等現在採用 Unicode 字串,而舊的行為已由新的函數write_latin1_string()
等接管。也有新的函數可以將 Unicode 字串寫入為 Latin-1 字串,主要針對 Erlang pretty printer (erl_pp
)。內部 ID:OTP-10745 輔助 ID:OTP-10302
新的函數
proc_lib:format/2
和erl_parse:abstract/2
接受編碼作為第二個引數。內部 ID:OTP-10749 輔助 ID:OTP-10302
增加 ETS 中
write_concurrency
選項的潛在並行性。內部表格鎖的數量已從 16 個增加到 64 個。這使得兩個同時寫入相同表格的並行程序發生衝突的機率降低了四倍,從而實現了序列化。代價是使用 write_concurrency 的表格的固定記憶體佔用量增加。每個插入記錄的記憶體消耗不受影響。如果write_concurrency
與read_concurrency
結合使用,則增加的佔用空間可能會特別大。內部 ID:OTP-10787
STDLIB 1.18.3
已修正的錯誤與故障
小型測試更新
內部 ID:OTP-10591
STDLIB 1.18.2
已修正的錯誤與故障
修正了在 Windows 上給定無效磁碟機代號時,確保目錄會進入無限迴圈的錯誤。
內部 ID:OTP-10104
對具有全域範圍且未指定逾時的 ServerName 的 gen_server:enter_loop/4 的呼叫現在可以正常運作。
感謝 Sam Bobroff 回報此問題。
內部 ID:OTP-10130
修正 escript/主要封存檔重新載入問題
如果 escript/主要封存檔在加入程式碼路徑後,其修改時間 (mtime) 發生變更,則正確重新載入封存檔並更新快取。(感謝 Tuncer Ayaz)
專屬 ID:OTP-10151
修正某些情況下,使用
compressed
選項的 ETS 表格中可能會導致二進位資料損毀的錯誤。專屬 ID:OTP-10182
修正 Win32 上 filename:nativename/1 的問題
修正 Win32 上,路徑以二進位引數形式給定時會發生的問題。感謝 Jan Klötzke
專屬 ID:OTP-10188
修正
ets:test_ms/2
中使用 match spec 中的'$_'
時可能導致模擬器當機的錯誤。專屬 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
修正在 64 位元電腦上,使用
compressed
選項且插入包含大整數 (>2G) 的 term 時,ETS 中發生的錯誤。此錯誤被認為會導致模擬器當機。(感謝 Diego Llarrull 提供出色的錯誤報告)專屬 ID:OTP-9932
為替代名稱查詢新增外掛程式支援。此修補程式引入一種定位行為執行個體的新方法:{via, Module, Name}。(感謝 Ulf Wiger)
專屬 ID:OTP-9945
digraph_utils:condensation/1
函式過去會建立一個包含迴圈的有向圖,這與說明文件指出所建立的有向圖沒有循環矛盾。此錯誤已修正。(感謝 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 甚至不會等待擱置的非同步執行緒操作。
若要大致回復舊行為,在結束模擬器時不等待埠和非同步執行緒操作,您可以使用具有第一個整數引數和包含 {flush,false} 的選項清單的 erlang:halt/2 作為第二個引數。請注意,現在刷新與結束程式碼無關,而且您無法只刷新非同步執行緒操作,我們認為這無論如何都是一種奇怪的行為。
此外,erlang:halt/1,2 還有一個新功能:如果第一個引數是原子 'abort',則模擬器會中止並產生核心傾印,前提是作業系統允許。
專屬 ID:OTP-9985
為 escript win32 新增替代調用。現在可以將 escript 作為 "escript.exe" 和 "escript" 啟動 (感謝 Pierre Rouleau)
專屬 ID:OTP-9997
STDLIB 1.18
修正錯誤和故障
改進
random
模組中的演算法。避免使用偶數質數除數的種子值,從而防止取得卡在零的子種子。最糟糕的情況是 random:seed(0,0,0),它會產生一系列零。從某種意義上來說,這是一個不相容的變更,因為依賴於為給定種子重現特定序列的應用程式將會失敗。偽隨機輸出仍然是確定性的,但與先前的版本不同。* 潛在的不相容性 *
專屬 ID:OTP-8713
由於後者並不安全,因此已將對
global:whereis_name/1
的呼叫替換為對global:safe_whereis_name/1
的呼叫。之前沒有這樣做的原因是,設定全域鎖會隱藏一個關於受監督子程序重新啟動的錯誤。現在已透過修改
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
如果 supervisor 的子程序以原因 {shutdown,Term} 終止,則現在會由 supervisor 像原因為 'shutdown' 一樣處理。
對於重新啟動類型為 'permanent' 的子程序,這表示沒有變更。對於重新啟動類型為 'transient' 的子程序,子程序將不再重新啟動,也不會寫入任何 supervisor 報告。對於重新啟動類型為 'temporary' 的子程序,不會寫入任何 supervisor 報告。
* 潛在的不相容性 *
專屬 ID:OTP-9222
稍為改進關於暫時和暫態子程序之 supervisor 重新啟動策略的文件。
專屬 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'。執行簡單的 lint 檢查,以確保不會重複定義回呼,且宣告所有參考的類型。
然後,工具可以使用這些屬性來提供行為的文件或找出回呼模組中回呼定義的差異。
將回呼規格新增至核心中的 'application' 模組 依照網際網路文件將回呼規格新增至 tftp 模組 依照可能已棄用的註解將回呼規格新增至 inets_service 模組
專屬 ID:OTP-9621
如果 Dets 表格已正確關閉,但無法讀取空間管理資料,則無法修復該檔案。此錯誤已修正。
專屬 ID:OTP-9622
Unicode 非字元程式碼點 16#FFFE 和 16#FFFE 不允許使用
unicode
模組或位元語法來編碼或解碼。這與可以編碼/解碼的其他非字元 16#FDD0 到 16#FDEF 不一致。為了解決不一致的問題,現在可以編碼和解碼 16#FFFE 和 16#FFFE。(感謝 Alisdair Sullivan。)* 潛在的不相容性 *
專屬 ID:OTP-9624
當包含另一個檔案時,讓 epp 先搜尋目前檔案的目錄 這完成了 R11 中只適用於 include_lib() 的部分修正。(感謝 Richard Carlsson)
專屬 ID:OTP-9645
ms_transform:修正不正確的「變數被遮蔽」警告
此修補程式會移除從一個函式子句到另一個函式子句不正確地傳遞變數繫結的情況。(感謝 Haitao Li)
專屬 ID:OTP-9646
在 supervisor 中明確終止動態子程序
根據監管者的文件:「關於 simple-one-for-one 監管者的重要注意事項:simple-one-for-one 監管者動態建立的子程序,無論關閉策略為何,都不會被明確終止,而是預期在監管者終止時(也就是收到來自父程序的結束訊號時)終止。」
當我們手動停止 simple_one_for_one 監管者時,一切都很好。動態子程序會捕獲來自監管者的結束訊號並離開。但是,如果發生在我們停止應用程式時,在頂層監管者停止後,應用程式主程序會終止與此應用程式相關的所有剩餘程序。因此,捕獲結束訊號的動態子程序可能會在清理期間(這裡指的是 terminate/2 內部)被終止。這是不可預測且高度依賴時間的。
在此提交中,監管者模組已修補,會根據關閉策略明確終止動態子程序。
注意:動態子程序停止的順序未定義。事實上,這「幾乎」是同時完成的。
停止動態子程序時發生堆疊錯誤
由於 simple_one_for_one 監管者可能有多個工作者,我們在關閉期間會堆疊錯誤,以便針對每個遇到的錯誤類型僅報告一則訊息。我們不報告子程序的 PID,而是使用相關子程序的數量。(感謝 Christopher Faulet)
自有 ID:OTP-9647
允許無限逾時來關閉工作者程序
現在,在子程序規格中,工作者子程序的關閉值也可以設定為無限。此限制已移除,因為並非總是能夠預測工作者的關閉時間。這高度取決於應用程式。在文件中新增關於工作者關閉策略的警告(感謝 Christopher Faulet)
自有 ID:OTP-9648
在列印錯誤報告且子程序 PID 未定義時,監管者中偶爾會發生 badarg 錯誤。此問題已修正。
自有 ID:OTP-9669
修正 re:split 規格不接受選項 'global'(感謝 Shunichi Shinohara)
自有 ID:OTP-9691
改進和新功能
修正一些在 HiPE 平台上會失敗的測試。
自有 ID:OTP-9637
現在,在 '
fun M:F/A
' 中允許使用變數,如 Richard O'Keefe 在 EEP-23 中所建議的。抽象格式中 '
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
已修正的錯誤和故障
當在使用者沒有讀取權限的父目錄內執行時,erl_tar:extract 失敗。此問題已修正。
自有 ID:OTP-9368
已修正
erl_scan:set_attribute/3
中的錯誤。自有 ID:OTP-9412
已修正
io_lib:fread()
的合約。自有 ID:OTP-9413 輔助 ID:seq11873
當嘗試比對文字字元時,遇到輸入資料結尾時,io_lib:fread/2 中發生崩潰,該函式應該傳回 {more,_,_,_},但卻發生崩潰。此問題已修正。由 Klas Johansson 報告。
當在任何欄位資料之前遇到檔案結尾時,io:fread 的類似特殊情況也已修正。
自有 ID:OTP-9439
已修正
timer:now_diff()
的合約。(感謝 Alex Morarash)。自有 ID:OTP-9450
修正 gen_fsm 文件中的小錯字(感謝 Haitao Li)
自有 ID:OTP-9456
已修正
zip:zip_list_dir/1
和zip:zip_get/2
的合約。自有 ID:OTP-9471 輔助 ID:seq11887, OTP-9472
已修正
zip:zip_open()
中的錯誤。自有 ID:OTP-9472 輔助 ID:seq11887, OTP-9471
修正一些簡單的文件錯誤(感謝 Matthias Lang)
自有 ID:OTP-9498
新增 proplist() 類型
最近我在新增 API 的規格時,發現沒有定義標準的 proplist() 類型。(感謝 Ryan Zezeski)
自有 ID:OTP-9499
修正監管者重新啟動暫時子程序的問題
在目前的監管者實作中,暫時子程序永遠不應重新啟動。但是,當暫時子程序在 one_for_all 或 rest_for_one 策略中重新啟動時,其中失敗的程序不是暫時子程序,監管者仍然會嘗試重新啟動它。
由於監管者不會保留暫時子程序的某些 MFA 資訊,這會導致監管者達到其重新啟動限制並崩潰。
此修補程式透過在 terminate_children/2-3(私有函式)中插入一個子句來修正此行為,該子句將在建立已終止程序的清單時省略暫時子程序,以避免監管者再次嘗試重新啟動它們。
只有需要重新啟動子程序的監管者會使用該清單,因此對於僅呼叫 terminate_children/2-3 來終止所有子程序的函式,此變更應該不會有影響。
文件已修改,以更明確地說明此行為。(感謝 Fred Hebert)
自有 ID:OTP-9502
修正損壞的 edoc 註解(感謝 Richard Carlsson)
自有 ID:OTP-9516
已修正 XML 檔案。
自有 ID:OTP-9550 輔助 ID:OTP-9541
處理密碼金鑰伺服器功能中罕見的競爭情況
自有 ID:OTP-9586
改進和新功能
已新增類型和規格。
自有 ID:OTP-9356
已修改
queue
模組的合約。自有 ID:OTP-9418
已改進 STDLIB 和 Kernel 中的合約,並修正類型錯誤。
自有 ID:OTP-9485
已擴充/修正數個 BIF 的類型。此外,已修正
lists:keyfind/3
、lists:keysearch/3
和lists:keyemember/3
的類型。不正確/不完整的類型可能會導致錯誤的 dialyzer 警告。自有 ID:OTP-9496
STDLIB 1.17.4
已修正的錯誤和故障
預設值
undefined
以一種方式新增至記錄欄位類型,使得結果並非總是格式良好的類型。此錯誤已修正。自有 ID:OTP-9147
以原子方式更新索引檔案
由於 log_mf_h 索引檔案可能會被錯誤處理程式以外的其他程序讀取(例如,rb 工具),因此應該以原子方式更新此檔案。這將避免在以寫入模式開啟檔案(從而清空檔案)和使用新內容實際更新之間發生時間間隔。為此,會寫入一個暫存檔,並使用 file:rename/1 來取代實際的索引檔案。
自有 ID:OTP-9148
修正文件中各處的各種錯字(感謝 Tuncer Ayaz)
自有 ID:OTP-9154
監管者不應儲存已終止的暫時程序的子程序規格,因為它們不應重新啟動。儲存暫時子程序規格將導致您無法使用與已終止的暫時程序相同的子程序規格來啟動新的暫時程序。自 R14B02 起,您無法重新啟動暫時暫時程序,因為引數不再儲存,但重新啟動暫時程序在語義上一直都是不正確的。感謝 Filipe David Manana 報告此問題並建議解決方案。
自有 ID:OTP-9167 輔助 ID:OTP-9064
各種小型的文件修正(感謝 Bernard Duggan)
自有 ID:OTP-9172
修正未註冊 gen_event 程序的 format_status 錯誤
將 format_status 的 gen_fsm 程式碼移植到 gen_event,以防止在未註冊的 gen_event 程序上呼叫 sys:get_status/1 時發生 lists:concat([...,pid()]) 崩潰。
將 format_status 標頭程式碼從 gen_* 行為重構到模組 gen。
擴充 gen_event_SUITE 中的 format_status 測試,以涵蓋匿名 gen_event 程序的 format_status 錯誤。(感謝 Geoff Cant)
自有 ID:OTP-9218
針對動態暫時子程序,監管者中的 pid 清單已變更為「set」。當新增/刪除許多子程序時,存取清單的效能會不佳。(感謝 Evgeniy Khramtsov)
自有 ID:OTP-9242
變更 pool 模組以嘗試附加到已在執行的節點
對於已在執行的節點,pool 模組會列印錯誤訊息,且不會採取進一步動作。此修補程式變更了該行為,因此如果從 slave:start/3 傳回 {already_running, Node},則仍會嘗試附加到該節點。這是合理的,因為使用者已在 .hosts.erlang 檔案中指定節點,表示希望該節點成為 pool 的一部分,且在 pool 啟動後可以成功手動附加。(感謝 Kelly McLaughlin)
自有 ID:OTP-9244
unicode: 文件 16#FFFE 和 16#FFFF(非字元)(感謝 Tuncer Ayaz)
自有 ID:OTP-9256
re:在 manpage 中移除多餘的「it」(感謝 Tuncer Ayaz)
自有 ID:OTP-9307
已修正 erl_eval(3) 中的錯誤。
自有 ID:OTP-9322
改進和新功能
新增
timer:tc/1
並移除tc/2
和tc/3
中的 catch。因此,時間測量函式將不再捕獲被測量函式導致的結束、錯誤或擲回。* 潛在的不相容性 *
自有 ID:OTP-9169
允許針對 simple_one_for_one 監管者使用 supervisor:terminate_child(SupRef,Pid)
如果監管者使用重新啟動策略 simple_one_for_one,則先前不允許使用 supervisor:terminate_child/2。現在已變更,可以透過指定子程序的 Pid 來終止此類型監管者的子程序。
(感謝 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 模組的文件
修正了文法和一個不一致之處(使用 Key - Value 而非 key/value,因為其他地方都使用前者)。(感謝 Filipe David Manana)
自有 ID:OTP-9083
在 stdlib 的 calendar 模組中新增 ISO 週數計算函式
這項新功能在 stdlib 應用程式的 calendar 模組中新增了缺少的週數函式。此實作符合 ISO 8601 標準。此新功能已實作、測試和記錄。(感謝 Imre Horvath)
自有 ID:OTP-9087
改進和新功能
實作 RFC4648 中關於填充字元的 'MAY' 子句,以使 mime_decode() 和 mime_decode_to_string() 函式更能容忍錯誤填充的 base64。為方便參考,以下引用 RFC。
「RFC4648 第 3.3 節關於 MIME 解碼:此外,如果填充字元 "=" 出現在編碼資料的末尾之前,此類規格可以忽略該填充字元,並將其視為非字母資料。如果字串末尾發現超過允許數量的填充字元(例如,以 "===" 結尾的 base64 字串),也可以忽略多餘的填充字元。」
自有 ID:OTP-9020
Supervisor 將不再為暫時程序儲存啟動參數,因為它們不會重新啟動。對於簡單的 one_for_one worker,例如 ssl 連線程序,這將大幅減少 supervisor 的記憶體佔用量。
自有 ID:OTP-9064
當執行 escript 時,現在可以新增 -n 旗標,escript 將使用 +native 進行編譯。
自有 ID:OTP-9076
STDLIB 1.17.2.1
已修正的錯誤和故障
R14B01 版本中,數個標準函式庫的型別規格不正確。現在已修正。這些修正與 re、io、filename 以及模組 erlang 本身的型別有關。
自有 ID:OTP-9008
STDLIB 1.17.2
已修正的錯誤和故障
當多個用戶端同時存取 Dets 表格時,其中一個用戶端呼叫
dets:insert_new/2
,Dets 伺服器可能會當機。或者,在相同條件下,有時會傳回ok
而非true
。(感謝 John Hughes。)自有 ID:OTP-8856
當多個用戶端同時存取 Dets 表格時,由於 Dets 檔案被截斷,有時會遺失插入或更新的物件。(感謝 John Hughes。)
自有 ID:OTP-8898
當多個用戶端同時存取 Dets 表格時,有時會丟棄對 Dets 伺服器內部狀態的修改。症狀多樣:出現原因為
bad_object
的錯誤;lookup()
未傳回插入的物件;等等。(感謝 John Hughes。)自有 ID:OTP-8899
如果在呼叫
bchunk/2
、match/1,3
、match_object/1,3
或select/1,3
後關閉 Dets 表格,然後再次開啟,後續使用傳回的繼續值的呼叫通常會傳回回覆。此錯誤已修正;現在呼叫會因原因badarg
而失敗。自有 ID:OTP-8903
Cover 沒有為包含 include 指示詞的檔案(例如 Yecc 剖析器)收集涵蓋率資料。此錯誤已透過修改 Erlang 程式碼預處理器
epp
來修正。自有 ID:OTP-8911
如果開啟的 Dets 表格的槽位少於鍵值,然後僅在查詢後關閉,則其內容不再格式良好。此錯誤已修正。(感謝 Matthew Evans。)
自有 ID:OTP-8923
在 supervisor 中,當其終止子程序時,如果該子程序碰巧提早一小部分時間以正常狀態結束,supervisor 會將其回報為錯誤。不應將其回報為錯誤。
* 潛在的不相容性 *
自有 ID:OTP-8938 輔助 ID:seq11615
改進和新功能
文件 filelib:wildcard/1,2 現在描述萬用字元的字元集語法。
自有 ID:OTP-8879 輔助 ID:seq11683
已防止
erlc
、dialyzer
、typer
、run_test
、heart
、escript
和erlexec
中發生緩衝區溢位。(感謝 Michael Santos。)
自有 ID:OTP-8892
使用浮點數作為
string:copies/2
的副本數量會導致無限迴圈。現在會改為失敗並產生例外。(感謝 Michael Santos。)自有 ID:OTP-8915
新增 ETS 選項
compressed
,以更緊湊的儲存格式來啟用,但會增加表格操作的負擔。對於測試和評估,可以使用erl +ec
來強制壓縮所有 ETS 表格。自有 ID:OTP-8922 輔助 ID:seq11658
Dets 表格的預設最大槽位數已變更為等於最大槽位數。(感謝 Richard Carlsson。)
自有 ID:OTP-8959
STDLIB 1.17.1
已修正的錯誤和故障
在文件中,reference() 已取代 ref()。
自有 ID:OTP-8733
改進和新功能
如果 fun 標頭遮蔽周圍的變數,ms_transform 現在會發出警告(就像在相同內容中針對一般 fun 發出的警告一樣)。
自有 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 實作。如需更多資訊,請參閱erl
的 +rg 命令列引數的文件。還有一個新的 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
函式庫。指定libatomic_ops
安裝位置時,請使用 --with-libatomic_ops=PATHconfigure
命令列引數。libatomic_ops
函式庫可以從以下網址下載:http://www.hpl.hp.com/research/linux/atomic_ops/ethread
函式庫的 API 變更也導致 Erlang 執行階段系統中的修改。由於即將推出的「延遲解除配置」功能依賴ethread
函式庫,因此也已完成準備工作。注意:當針對 x86 建置時,
ethread
函式庫現在將使用首先出現在 pentium 4 處理器上的指令。如果您希望執行階段系統與較舊的處理器(回溯到 486)相容,則在設定系統時,需要傳遞 --enable-ethread-pre-pentium4-compatibilityconfigure
命令列引數。自有 ID:OTP-8544
由於向後相容性的考量,模組 erlang 中某些內建函式 (BIF) 從未被自動匯入。現在,區域函式會覆蓋自動匯入的函式,新的自動匯入不再是問題,因此以下 BIF 最終被設為自動匯入:monitor/2、monitor/3、demonitor/2、demonitor/3、error/1、error/2、integer_to_list/2、list_to_integer/2。
專案編號:OTP-8763
STDLIB 1.17
已修正的錯誤與故障
當解析
file
屬性時,Erlang 程式碼預處理器 (epp
) 會向客戶端傳送額外的{eof,Location}
格式訊息。這個在 R11B 中引入的錯誤已修正。專案編號:OTP-8470
抽象類型 'fun' 無法由 Erlang 美化列印器 (
erl_pp
) 列印。這個錯誤已修正。專案編號:OTP-8473
當給予單字
spec
時,函式erl_scan:reserved_word/1
不再傳回true
。這個錯誤是在 STDLIB-1.15.3 (R12B-3) 中引入的。專案編號:OTP-8567
lists:keysort/2
的文件指出排序是穩定的。專案編號:OTP-8628,輔助編號:seq11576
Shell 的行編輯已改進,更接近 readline 和其他 shell 的行為。(感謝 Dave Peticolas)
專案編號:OTP-8635
在定義巨集時,Erlang 程式碼預處理器 (
epp
) 無法正確處理過早的輸入結束。這個在 STDLIB 1.16 中引入的錯誤已修正。專案編號:OTP-8665,輔助編號:OTP-7810
改進和新功能
實作了 EEP31 (和 EEP9) 中的模組 binary。
專案編號:OTP-8217
Erlang 美化列印器 (
erl_pp
) 不再在類型中引用原子。專案編號:OTP-8501
Erlang 程式碼預處理器 (
epp
) 現在將沒有欄位的記錄視為已輸入類型。專案編號:OTP-8503
新增函式
zip:foldl/3
以迭代 zip 封存檔。新增用於建立和提取 escript 的函式。請參閱
escript:create/2
和escript:extract/2
。已移除未記錄的函式
escript:foldl/3
。相同的功能可以使用更靈活的函式escript:extract/2
和zip:foldl/3
來實現。記錄欄位已使用類型資訊進行註解。原始碼檔案已調整為符合 80 個字元的限制,並已移除尾隨空白。
專案編號:OTP-8521
Erlang 解析器不再在沒有初始值的記錄欄位的類型中複製 singleton 類型
undefined
。專案編號:OTP-8522
具有多層括號的正規表示式可能會導致緩衝區溢位。這已修正。(感謝 Michael Santos。)
專案編號:OTP-8539
在定義巨集時,點之前的右括號現在是強制性的。
* 潛在的不相容性 *
專案編號:OTP-8562
已定義已編譯 re 模式的某些屬性,以允許進行 guard 測試。
專案編號: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
編譯器指令,可能需要變更才能被編譯器接受。* 潛在的不相容性 *
專案編號:OTP-8579
已移除未記錄、不受支援且已棄用的函式
lists:flat_length/1
。專案編號:OTP-8584
已修正 re 中可能導致某些正規表示式比對永遠不會終止的錯誤。(感謝 Michael Santos 和 Gordon Guthrie。)
專案編號:OTP-8589
現在可以不用括號存取巢狀記錄。有關範例,請參閱參考手冊。(感謝 YAMASHINA Hio 和 Tuncer Ayaz。)
專案編號:OTP-8597
現在特別優化了只能讀取新建立的參考的
receive
語句,使其執行時間為常數,而與程序接收佇列中的訊息數量無關。此最佳化將有益於對gen_server:call()
的呼叫。(請參閱gen:do_call/4
以取得將被最佳化的 receive 語句範例。)專案編號:OTP-8623
beam_lib:cmp/2 函式現在以更嚴格的方式比較 BEAM 檔案。如果除了編譯資訊 ("CInf") 區塊之外有任何變更,則 BEAM 檔案將被視為不同。beam_lib:cmp/2 過去會忽略除錯資訊(對 Dialyzer 很重要)和其他不會直接更改執行時行為的區塊中的差異。
專案編號:OTP-8625
當 gen_server、gen_fsm 程序或 gen_event 異常終止時,有時程序狀態的文字表示可能會佔據錯誤日誌中的許多行,具體取決於狀態術語的定義。已新增從日誌中修剪部分狀態的機制(使用 format_status/2 回呼)。請參閱文件。
專案編號:OTP-8630
呼叫具有全域註冊名稱且不是原子的程序的
sys:get_status()
會導致當機。已修正。(感謝 Steve Vinoski。)專案編號:OTP-8656
Erlang 掃描器已新增兩個新的 token:
..
和...
。專案編號:OTP-8657
現在可以在類型和函式規格中使用計算結果為整數的運算式,而之前只允許使用整數 ("Erlang_Integer")。
專案編號:OTP-8664
編譯器能更好地最佳化記錄操作。
專案編號: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]}). 來移除警告。
* 潛在的不相容性 *
專案編號:OTP-8669,輔助編號:OTP-8579
現在,binary_to_term/2 是自動匯入的。如果模組有一個具有該名稱的區域函式,則這將導致編譯警告。
* 潛在的不相容性 *
專案編號:OTP-8671
已移除預先定義的內建類型 tid()。相反,應使用 ets:tid()。
* 潛在的不相容性 *
專案編號:OTP-8687
STDLIB 1.16.5
已修正的錯誤與故障
由於競爭條件,使用多個程序中的 filelib:ensure_dir/1 來建立相同的路徑或相同目錄結構的部分,filelib:ensure_dir/1 可能會傳回毫無意義的 {error,eexist}。已消除這種競爭條件,現在只有當存在具有相同名稱的普通檔案、裝置檔案或某些其他非目錄檔案時,才會傳回 {error,eexist}。(感謝 Tuncer Ayaz。)
專案編號:OTP-8389
已修正許多關於 re 和 unicode 的錯誤
re:compile 不再遺失 unicode 選項,這也修正了 re:split 中的錯誤。
re:replace 現在處理 unicode 字元串列替換引數
re:replace 現在正確處理 unicode RE 字元串列引數
當沒有取代任何內容時,re:replace 現在正確處理二進位 unicode 輸出。
大部分程式碼、測試案例和錯誤隔離由 Rory Byrne 完成。
專案編號:OTP-8394
在 SMP 模擬器中,原生程式碼的載入並非完全原子,這可能會導致當機。此外,由於在 SMP 模擬器中可能會同時存取它,因此現在原生程式碼的每個 MFA 資訊表都已受到鎖定的保護。(感謝 Mikael Pettersson。)
專案編號:OTP-8397
user.erl(用於 oldshell 中)已更新,以處理提示字串中的 unicode (io:get_line/{1,2})。io_lib 也已更新,以使用 't' 修飾符格式化提示 (即 ~ts 而不是 ~s)。
專案編號:OTP-8418,輔助編號:OTP-8393
re 模組:在具有頂層替代的模式開頭具有選項變更的正規表示式可能會導致覆寫和/或當機。(感謝 Michael Santos。)
專案編號:OTP-8438
改進和新功能
已還原並記錄 gen_server 和 gen_fsm 回呼模組在 sys:get_status/1,2 呼叫下格式化自己狀態以進行顯示的能力。(感謝 Steve Vinoski。)
專案編號:OTP-8324
c:nc/{1,2} 過去假設 BEAM 檔案是在與原始碼相同的目錄中建立的,如果不是,則無法載入程式碼。已修正為在目前目錄或
{outdir,Dir}
選項指定的目錄中尋找 BEAM 檔案。(感謝 Alex Suraci。)專案編號:OTP-8337
現在可以在開放原始碼環境中建置文件,並在文件建置過程中修正了一些錯誤並新增了一些功能。
- 已更新 arity 計算。
- 在產生的連結中,已移除 bif 函式名稱中使用的模組前綴,因此連結看起來會像 "https://erlang.dev.org.tw/doc/man/erlang.html#append_element-2"" 而不是 "https://erlang.dev.org.tw/doc/man/erlang.html#erlang:append_element-2""。
- 當載入新頁面時,增強了 HTML 文件中的選單定位。
- 手冊頁產生中的一些更正(感謝 Sergei Golovan)
- 法律聲明取自 XML 書籍檔案,因此 OTP 的建置流程可用於非 OTP 應用程式。
專案編號:OTP-8343
Shell 的 Tab 鍵補全現在適用於帶引號的模組和函式名稱。(感謝 Ulf Wiger。)
專案編號:OTP-8383
現在,封存檔案中的明確頂層目錄是可選的。
例如,如果封存檔 (app-vsn.ez) 僅包含 app-vsn/ebin/mod.beam 檔案,則使用封存檔的檔案資訊作為來源來偽造 app-vsn 和 app-vsn/ebin 目錄的檔案資訊。也可以列出虛擬目錄。簡而言之,如果頂層目錄不存在,它們就是虛擬的。
專案編號:OTP-8387
已實作巨集超載。(感謝 Christopher Faulet。)
專案編號:OTP-8388
可以使用新函式
shell:prompt_func/1
和新的應用程式組態參數shell_prompt_func
自訂 Erlang Shell 提示。專案編號:OTP-8393
改進了 escript 中已輸入記錄的處理
專案編號:OTP-8434
新增 supervisor:count_children/1,以計算正在管理的子程序數量,而不會對 which_children/1 造成記憶體影響。(感謝 Jay Nelson。)
專案編號: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 美化列印器 (
erl_pp
) 現在會將列表推導式的前導[
以及位元字串推導式的前導<<
放在單獨的一行,以顯示範本的 Cover 計數器。自有 Id: OTP-8227
編譯器現在可以識別用於 Leex 輸入檔的副檔名 ".xrl"。
自有 Id: OTP-8232
說明文件中已針對
gen_server
、gen_fsm
和gen_event
行為處理來自父處理序的'EXIT'
訊息時,進行一些澄清。如需更多資訊,請參閱gen_server
、gen_fsm
和gen_event
說明文件。自有 Id: OTP-8255 Aux Id: seq11419
當載入模組時,可以使用 -on_load() 指示詞來執行函式。它已記錄在參考手冊中關於程式碼載入的章節中。
自有 Id: OTP-8295
STDLIB 1.16.3.1
已修正的錯誤和故障
當
{spawn_opt, SpawnOptionList}
傳遞至gen_server
和gen_fsm
啟動函式的選項清單時,gen:start/6
的錯誤型別規格導致 dialyzer 錯誤地發出警告。自有 Id: OTP-8068 Aux Id: seq11323, seq11314
STDLIB 1.16.3
已修正的錯誤和故障
linter 過去會因無效的
-opaque
宣告而當機。自有 Id: OTP-8051
已修正
digraph:add_edge/5
和digraph:del_path/3
中的錯誤。(感謝 Crystal Din。)自有 Id: OTP-8066
當嘗試使用
dets:insert_new()
將物件插入類型為duplicate_bag
的 Dets 資料表時,已存在的物件有時會重複。此錯誤已修正。(感謝 Crystal Din。)自有 Id: OTP-8070
在非常深的目錄(路徑長度為 256 個字元以上)中執行 erlc 會導致模擬器在呼叫
list_to_atom/1
時當機。(感謝 Chris Newcombe。)自有 Id: OTP-8124
Erlang 程式碼前處理器 (
epp
) 中已修正一些小錯誤。自有 Id: OTP-8130
Erlang Meta Interpreter (
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
Erlang Meta Interpreter (
erl_eval
) 在解釋receive
運算式方面已稍微最佳化。(感謝 Richard Carlsson。)自有 Id: OTP-8139
Erlang 美化列印器 (
erl_pp
) 已修改為可處理型別。自有 Id: OTP-8150
STDLIB 1.16.2
已修正的錯誤和故障
當給定
text
選項且StartLocation
為行時,Erlang 掃描器 (erl_scan
) 傳回的符號文字有時會是空的。此錯誤已修正。自有 Id: OTP-7965
已更新
base64:decode/1
的說明文件,以指出它會移除空白。base64:decode/1
和base64:mime_decode/1
有時會失敗,而不是移除非 base64 字元。自有 Id: OTP-7984
已修正
gen
模組中的兩個型別。自有 Id: OTP-8029 Aux 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 現在支援 arity 為 1 的 seed,
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
改進與新功能
除非提供新的選項
text
(與 R13A 不相容),否則當起始位置是一行和一欄的配對時,Erlang 掃描器不再傳回符號的文字。有新的函式可存取符號的屬性:
attributes_info/1,2
和set_attribute/3
。* 潛在的不相容性 *
自有 Id: OTP-7892 Aux Id: OTP-7810
已修正 R13A 的 Unicode 和 I/O 系統實作中的數個小故障和效能問題。
自有 Id: OTP-7896 Aux Id: OTP-7648 OTP-7887
已修正 filelib:wildcard/2 的型別規格。
自有 Id: OTP-7915
新函式:
gb_sets:is_disjoint/2
、ordsets:is_disjoint/2
和gb_sets:is_disjoint/2
。自有 Id: OTP-7947
已記錄 R13A 中新增的函式
gb_trees:map/2
。自有 Id: OTP-7948
STDLIB 1.16
已修正的錯誤和故障
已修正
gen_server:start*
中的輕微競爭情況:如果其中一個函式傳回{error,Reason}
或ignore
,名稱可能仍然會註冊 (在本機或global
中)。在某些情況下,由
proc_lib
啟動的處理序依賴其處理序字典不會被清除,且會在異常終止時當機,而不會產生適當的當機報告。這已修正(但如果處理序字典已被清除,則初始呼叫將不會顯示在錯誤報告中)。注意:基於記憶體節約的原因,不再需要清除處理序字典,因為實際的呼叫引數不再儲存在處理序字典中。自有 Id: OTP-7669
Erlang 前處理器在字串化巨集引數時使用了錯誤的行號。(感謝 John Hughes。)
自有 Id: OTP-7702
已修正
qlc
模組中的一個錯誤:合併聯結有時無法傳回所有答案。(感謝 Bernard Duggan。)自有 Id: OTP-7714
改進與新功能
已將新的選項
key_equality
新增至qlc:table/2
。此選項可讓qlc
更好地處理在比較索引鍵是否相等時使用==/2
的資料表 (此類資料表的範例是 qlc(3) 中的排序 ETS 資料表和 gb_table)。自有 Id: OTP-6674
在少數情況下,函式
lists:seq/1,2
會傳回空清單,而不是像過去一樣產生例外狀況,例如lists:seq(1, 0)
。請參閱 lists(3) 以取得詳細資訊。(感謝 Richard O'Keefe。)* 潛在的不相容性 *
自有 Id: OTP-7230
現在已記錄在 ordered_set 中選取時所存取物件的順序。
自有 Id: OTP-7339
現在可以對 escript 和封存檔中的程式碼進行除錯。
自有 Id: OTP-7626
Unicode 的支援已實作,如 EEP10 中所述。io 和 io_lib 模組支援格式化和讀取來自終端機和檔案的 unicode 資料。可以使用自動翻譯為不同 unicode 格式和從不同 unicode 格式翻譯的模式開啟檔案。「unicode」模組包含用於在外部和內部 unicode 格式之間轉換的函式,而 re 模組支援 unicode 資料。還有用於指定超出 ISO-latin-1 範圍的字串和字元資料的語言語法。
當終端機和作業系統支援時,互動式 shell 將支援 Unicode 字元的輸入和輸出。
請參閱 EEP 和 io/io_lib 手冊頁以及 stdlib 使用者指南以取得詳細資訊。
I/O 通訊協定不相容
io_Server 和用戶端之間的 io_protocol 已更新,以處理 unicode 格式的通訊協定資料。更新後的通訊協定現在已記錄在文件中。規格位於 stdlib _users 手冊_ 中,這是手冊的新部分。
io 模組不相容
io:put_chars、io:get_chars 和 io:get_line 都會處理並傳回 unicode 資料。在可以提供二進位資料的情況下(如 io:put_chars),它們應以 UTF-8 編碼。當傳回二進位資料時(如當 io_server 設定在 _binary 模式_ 時由 io:get_line/get_chars 傳回),傳回的資料也 _一律_ 編碼為 UTF-8。但是,檔案模組仍然會傳回位元組導向的資料,因此可以使用 file:read 而不是 io:get_chars 來讀取 ISO-latin-1 中的二進位資料。
io_lib 模組不相容
io_lib:format 函式在給定新的格式指令(例如 "~ts" 和 "~tc")時,可以回傳包含大於 255 的整數的列表。
* 潛在的不相容性 *
內部 ID:OTP-7648 輔助 ID:OTP-7580 OTP-7514 OTP-7494 OTP-7443 OTP-7181 EEP10 EEP11
如果節點已連接,則函式
pool:attach/1
現在會回傳already_attached
,而不是allready_attached
(原文如此!)。(感謝 Edwin Fine。)內部 ID:OTP-7653 輔助 ID:OTP-7603
現在允許在 escript 中使用前置處理器指令。這表示例如可以在 escript 中使用巨集。
內部 ID:OTP-7662
當使用
proc_lib
、gen_server
或gen_fsm
啟動的進程因原因{shutdown,Term}
而結束時,將不再產生崩潰報告(允許正常關閉,但仍為連結到終止進程的進程提供額外資訊)。內部 ID:OTP-7740 輔助 ID:seq10847
新增了一個新的 BIF,
lists:keyfind/3
。它的運作方式與lists:keysearch/3
類似,但如果成功,它不會將回傳的元組包裝在value
元組中。(感謝 James Hague 建議這個函式。)內部 ID:OTP-7752
lists:suffix(Suffix, List)
過去的複雜度為length(Suffix)*length(List)
(對於某些輸入可能會變得相當慢)。現在已重新實作,使其複雜度為length(Suffix)+length(List)
。(感謝 Richard O'Keefe 提供新的實作方式。)內部 ID:OTP-7797
Erlang 掃描器已擴充,可以回傳空白字元、註解和符號的確切位置。函式
string/3
、tokens/4
和token_info/1,2
是新的。請參閱 erl_scan(3) 以取得詳細資訊。已修改
tokens/3,4
,使其在遇到點之前的eof
時回傳符號列表,而不是錯誤。內部 ID:OTP-7810
filelib:fold_files/5
現在使用re
模組,而不是regexp
模組進行正規表示式比對。實際上,對於filelib:fold_files/5
使用的大多數正規表示式而言,此變更不會是問題。(正規表示式的主要差異在於,括號和花括號被regexp
視為字面字元,但被re
視為特殊字元;幸運的是,這些字元很少在檔案名稱中使用。)* 潛在的不相容性 *
內部 ID:OTP-7819
如果
Type
不是有效類型,digraph:new(Type)
現在會導致badarg
例外。同樣地,如果引數無效,digraph_utils:subgraph/2,3
現在也會導致badarg
。(如果發生錯誤,這些函式過去會回傳錯誤元組。)* 潛在的不相容性 *
內部 ID:OTP-7824
傳遞給
random:uniform/1
的引數現在必須是整數(如文件中所述)。在先前的版本中,也允許使用浮點數。* 潛在的不相容性 *
內部 ID:OTP-7827
已更新版權聲明。
內部 ID:OTP-7851
dbg:fun2ms 中新增了一些遺失的 match spec 函式:exception_trace/0 和 trace/2,3。
新增了一個函式 queue:member/2。
修正了 io_lib:fread 中的一個錯誤,該錯誤會意外地串連以換行符號分隔的欄位。由 Matthew Palmer 回報並分析至 erlang-patches。
內部 ID:OTP-7865
STDLIB 1.15.5
已修正的錯誤和故障
修正了
qlc
模組中的一個錯誤:當合併聯結兩個查詢控制代碼時,用於等效類別的暫存檔未正確截斷,這可能會導致效能不佳。內部 ID:OTP-7552
字元 16#C0 和 16#E0(帶重音符號的 "A" 和 "a")未被函式
string:to_lower/1
和string:to_upper/1
正確轉換。(感謝 Richard O'Keefe。)內部 ID:OTP-7589
如果節點已連接,則函式
pool:attach/1
現在會回傳already_attached
,而不是allready_attached
(原文如此!)。(感謝 Edwin Fine。)* 潛在的不相容性 *
內部 ID:OTP-7603
io:get_line/1,2
的文件現在提及回傳值也可以是{error,Reason}
。內部 ID:OTP-7604 輔助 ID:seq11063
改進和新功能
現在已將分割函式新增至 re 程式庫。來自 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 和函式引數可能會浪費大量記憶體。
變更的缺點是崩潰報告將提供關於初始呼叫的較不精確的資訊(僅
Module:Function/Arity
,而不是Module:Function(Arguments)
)。函式proc_lib:initial_call/1
仍會回傳列表,但每個引數都已替換為虛擬原子。內部 ID:OTP-7531 輔助 ID:seq11036
現在實驗性支援從封存檔載入程式碼。請參閱
code
、init
、erl_prim_loader
和escript
的文件以取得更多資訊。已改進
escript
的錯誤處理。escript
現在可以為模擬器設定明確的引數,例如-smp enabled
。escript
現在可以包含預先編譯的 beam 檔。escript
現在可以包含一個封存檔,其中包含一個或多個應用程式(實驗性)。已移除內部模組
code_aux
。內部 ID:OTP-7548 輔助 ID:otp-6622
啟用明確控制在 ZIP 封存檔中應該壓縮的檔案類型。
內部 ID:OTP-7549 輔助 ID:otp-6622
在工作控制模式中,"s" 和 "r" 命令現在接受一個可選引數來指定要啟動哪個 shell。(感謝 Robert Virding。)
內部 ID:OTP-7617
STDLIB 1.15.4
已修正的錯誤和故障
日曆模組中的一個錯誤可能導致 calendar:local_time_to_universal_time_dst/1 對於沒有 DST 的時區中的本地時間回傳重複的相同值。僅當本地時間在因從 DST 轉換為非 DST 而發生兩次的時段內時,才應該回傳多個值,並且當然僅在具有 DST 的時區中。現在已實作正確的行為。
內部 ID:OTP-7344 輔助 ID:seq10960
已更正
(d)ets:init_table()
的文件。(感謝 Paul Mineiro。)內部 ID:OTP-7413
在 R12B-0 中為函式
io:fwrite/2,3
和io_lib:fwrite/2
的控制序列p
和P
引入的行上非空白字元數量的軟上限 60 已被移除。這表示其列印表示適合在一行的術語將沒有換行符號。不過,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
的無效引數處理不正確。元組位置 (Pos
) 小於 1 會導致更新鍵後面的元素(就像沒有指定任何位置一樣)。現在,所有Pos
的無效值都會導致badarg
錯誤。自身 ID:OTP-7226
對於某些終端機,io:columns/0 可能會回傳 0 而不是 enotsup。現在已修正此問題。
自身 ID:OTP-7229 輔助 ID:seq10886
qlc:info()
現在可以處理埠識別符號、PID、參考和函數。(感謝 Wojciech Kaczmare 回報此錯誤。)在評估傳送給呼叫
qlc:cursor()
的程序的parent_fun
訊息時,有時會錯誤地被消耗。此錯誤已修正。自身 ID:OTP-7232
erl_parse:abstract()
現在可以處理位元字串。自身 ID:OTP-7234
改進和新功能
已重寫
queue
模組,使其更易於使用。2007 年 12 月在 erlang-questions@erlang.org 上,來自 Lev Walkin、Anders Ramsell 和 Rober Virding 等人的建議和討論。也曾討論過更改內部表示方式以包含長度資訊,這將加速len/1
,但該變更已延後。任何有興趣的人都可以撰寫 EEP,並嘗試為佇列開銷達成可接受的妥協方案,從而提高除len/1
之外所有其他操作的速度。queue
模組現在針對快速且最少垃圾的in/2
和out/1
等進行了最佳化。請參閱文件。新函式:
is_queue/1
、get/1
、get_r/1
、peek/1
、peek_r/1
、drop/1
、drop_r/1
和liat/1
。is_queue/1
是一個新的謂詞,liat/1
是一個舊拼寫錯誤的修正,而其他(get
*、peek
* 和drop
*)是新的介面函式。自身 ID:OTP-7064
在寫入浮點數方面,
io_lib:write/1,2
和io_lib:print/1,4
函式已變更。此變更會影響io_lib
模組的控制序列p
、P
、w
和W
。(感謝 Bob Ippolito 的程式碼貢獻。)自身 ID:OTP-7084
已更新
erlang:function_exported/3
和io:format/2
函式的文件,不再聲明這些函式主要為了向後相容性而保留。自身 ID:OTP-7186
新的 BIF ets:update_element/3。在 ets 元組中更新個別元素,而無需讀取、更新和寫回整個元組。
自身 ID:OTP-7200
string:join/2
現在接受空清單作為第一個引數。自身 ID:OTP-7231 輔助 ID:OTP-6671
qlc:info/1,2
接受一個新的選項depth
。qlc:table/2
說明中使用的SelectedObjects
類型已擴充。自身 ID:OTP-7238
在文件中,已將
tuple_size/1
和byte_size/1
取代為size/1
。自身 ID:OTP-7244
STDLIB 1.15.1
修正的錯誤和故障
Ets:select/3 與 ets:repair_continuation/2 和 ordered_set 資料表結合使用時,即使按預期使用,也可能會導致 function_clause。現在已修正此問題。感謝 Paul Mineiro 找出並隔離了此錯誤!
自身 ID:OTP-7025
現在,已棄用的函式
ftp:close/1
的編譯器警告會提及正確的替代函式。已將
httpd_util
模組中已移除函式的警告變更為說明它們已被移除,而不僅僅是已棄用。(感謝 Fredrik Thulin。)自身 ID:OTP-7034 輔助 ID:seq10825
在
(Expr)#r{}
(未更新任何欄位)中,Expr
不再評估多次。還有一個測試來驗證Expr
是否為正確的記錄類型。(感謝 Dominic Williams。)自身 ID:OTP-7078 輔助 ID:OTP-4962
文件錯誤修正和澄清。
(感謝 Joern (opendev@gmail.com)、Matthias Lang 和 Richard Carlsson。)
自身 ID:OTP-7079
使用比對規範遍歷 QLC 資料表時,有時不會從答案清單中刪除重複的物件。(感謝 Dmitri Girenko。)
自身 ID:OTP-7114
改進和新功能
已更新文件,以反映 Erlang Shell 的最新更新,以及
io_lib
模組的控制序列p
的微小修改。已從程式碼範例和 Erlang Shell 範例中移除多餘的空白行。
自身 ID:OTP-6944 輔助 ID:OTP-6554、OTP-6911
已將
tuple_size/1
和byte_size/1
取代為size/1
。自身 ID:OTP-7009
現在可以休眠 gen_server/gen_event/gen_fsm。在 gen_server 和 gen_fsm 中,休眠是由回傳原子 'hibernate' 而不是逾時值觸發。在 gen_event 的情況下,休眠是由事件處理常式回傳一個額外元素包含原子 'hibernate' 的元組觸發。
自身 ID:OTP-7026 輔助 ID:seq10817
已將一些未記載的偵錯功能新增至 Dets。
自身 ID:OTP-7066
函式
digraph_utils:is_tree/1
、digraph_utils:is_arborescence/1
和digraph_utils:arborescence_root/1
是新的。自身 ID:OTP-7081
如果記錄更新程式碼由多行原始碼組成,編譯器可能會為記錄更新產生次佳程式碼。
自身 ID:OTP-7101
STDLIB 1.15
修正的錯誤和故障
已修正
qlc
中的錯誤。- 將
qlc:table/2
的lookup_fun
選項設定為undefined
可能會導致當機。 - 如果 QLC 以允許使用比對規範進行遍歷的方式限制資料表的某些欄位,且 QLC 還將資料表的鍵欄位或某些索引欄位與某些其他資料表的欄位進行比較,則
qlc
始終選擇先遍歷該資料表,而從不考慮查詢聯結。現在已變更為始終優先選擇查詢聯結;如果希望使用比對規範進行初始遍歷,則需要透過引入一個額外的 QLC 並使用限制該欄位的篩選器來重寫查詢。 - 當嘗試尋找比對規範和查詢的候選項時,除非篩選器緊接在產生器之後且可能緊接在使用來自同一產生器的變數的其他篩選器之後,否則使用僅來自一個產生器的變數的篩選器會被忽略。特別是,聯結兩個資料表的篩選器不應放在產生器和僅使用該產生器的篩選器之間。
- 用於實作 QLC 資料表的呼叫函式
TraverseFun
從 STDLIB 1.14 (OTP-5195) 開始,允許回傳列表以外的項。但是,當回傳的項是 fun 時,qlc
通常會嘗試呼叫該 fun 而不是回傳它。
也實作了一些次要的最佳化。
自身 ID:OTP-6673
- 將
已修正從 Shell 使用參數化模組的錯誤。
自身 ID:OTP-6785
已修正
erl_eval
模組中位元語法的 size 表達式錯誤。自身 ID:OTP-6787
log_mf_h 事件處理常式在完成讀取索引檔案後,未關閉索引檔案,導致檔案描述子洩漏。
自身 ID:OTP-6800
已將
filename()
和dirname()
類型的定義新增至filelib
模組的文件中。自身 ID:OTP-6870
對於夠奇怪的檔案系統問題,例如寫入已滿的檔案系統,file:write_file/3、file:write/2 和 file:read/2 可能會當機(與文件相反)。此錯誤現已修正。
在此過程中,已重寫檔案模組以產生更好的錯誤代碼。現在,Posix 錯誤代碼源自 OS 檔案系統呼叫,或僅針對非常相似的原因產生(例如,如果記憶體配置失敗,則會產生 'enomem';如果 Erlang 中的檔案控制代碼是檔案控制代碼但目前無效,則會產生 'einval')。
現在會產生更多類似 Erlang 的錯誤代碼。例如,如果引數不是檔案控制代碼類型,則
file:close/1
現在會回傳{error,badarg}
。請參閱 file(3)。已移除使用
file:write/2
寫入單個位元組而不是一個位元組的列表或二進位檔案的可能性,這與文件相反。* 潛在的不相容性 *
自身 ID:OTP-6967 輔助 ID:OTP-6597 OTP-6291
已修正
erl_eval
中有關評估++/2
運算子的錯誤。(感謝 Matthew Dempsky。)自身 ID:OTP-6977
改進和新功能
在極少數情況下,當呼叫者連結到被呼叫的伺服器,且伺服器在呼叫期間當機時,gen:call/3,4 內部函式的行為已略微變更;其結束訊號被 gen:call/3,4 程式碼消耗並轉換為結束例外。此結束訊號不再被消耗。
若要注意到此變更,1) 呼叫程序必須連結到被呼叫的伺服器。
呼叫不得按名稱進行遠端,即必須按 PID 進行本機或遠端、按名稱進行本機或按名稱進行全域。
呼叫程序必須設定
process_flag(trap_exit, true)
。伺服器必須在呼叫期間當機。
呼叫程序必須對在其訊息佇列中接收先前已消耗的
{'EXIT',Pid,Reason}
訊息敏感。
舊的行為曾經是客戶端注意到伺服器是否死機的唯一方法,但自引入
erlang:monitor(process, {Name,Node})
並在 gen:call 中使用以來,如果不是錯誤,則被視為不必要的行為。受影響的使用者 API 包括:
gen_server:call/2,3
、gen_fsm:sync_send_event/2,3
、gen_fsm:sync_send_all_state_event/2,3
、gen_event:_
、sys:_
,以及一些可能不太會被注意到的其他 API。* 潛在的不相容性 *
自身 ID:OTP-3954 輔助 ID:Seq 4538
發生例外時,Erlang Shell 現在會以更清晰的方式顯示類別、原因和堆疊追蹤(而不是像以前一樣傾印原始的 EXIT 元組)。
proc_lib:format/1
會以相同更清晰的方式顯示當機報告的例外。新的 shell 命令
catch_exception
和新的應用程式組態參數shell_catch_exception
可用於捕獲通常會導致 Erlang shell 退出的異常。Own Id: OTP-6554 Aux Id: OTP-6289
函數
string:join/2
將列表中的字串以分隔符號連接起來。範例:'string:join(["a", "b", "c"], ", ")
會產生 "a, b, c"'Own Id: OTP-6671
函數
io:fwrite/2,3
和io_lib:fwrite/2
的Format
參數中的控制序列P
,現在在列印元組和列表時會插入較少的分行符號。已引入每行非空白字元數量的軟上限 60。Own Id: OTP-6708
新的模組
array
提供了一個快速的函數式陣列實作。Own Id: OTP-6733
下列模組中,長期以來已棄用的函數現在已被移除:
dict
、erl_eval
、erl_pp
、io
、io_lib
、lists
、orddict
、ordsets
、sets
和string
。未公開的函數
lists:zf/3
也已被移除 (請改用列表推導式或lists:zf/2
)。* 潛在的不相容性 *
Own Id: OTP-6845
針對 file:pread/2 和 file:pread/3 的文件進行了小幅修正。
Own Id: OTP-6853
Kernel 和 STDLIB 模組的合約指令。
Own Id: OTP-6895
已棄用多個版本的
ets:fixtable/2
函數已被移除。ets:info/1
函數已重新實作為 BIF,這保證了返回的資訊是一致的。如果第二個參數無效,
ets:info/2
函數現在會以badarg
的原因失敗。(可以使用 Dialyzer 來找出第二個參數拼寫錯誤的錯誤程式碼。)* 潛在的不相容性 *
Own Id: OTP-6906
Erlang 的美化列印器
erl_pp
現在會插入更多的換行符號,以便Cover
進行行覆蓋率分析。(感謝 Thomas Arts。)Own Id: OTP-6911
關於在表格遍歷期間插入物件時會發生的情況,現在 ets:safe_fixtable/2、ets:foldl/3 和 ets:foldr/3 的文件說明更加清晰。
Own Id: OTP-6928 Aux Id: seq10779
現在可以直接將 tar 檔案中的檔案解壓縮到二進位檔案中。也可以直接從二進位檔案將檔案新增到 tar 檔案中。
Own Id: OTP-6943
函數
keystore/4
和keytake/3
是lists
模組中的新函數。Own Id: OTP-6953
新的
qlc
選項tmpdir_usage
可用於在即將建立暫存檔時,將訊息輸出到錯誤記錄器,或完全禁止使用暫存檔。Own Id: OTP-6964
STDLIB 1.14.5.3
改進和新功能
更新了 -type() 和 -spec() 的允許語法。
Own Id: OTP-6861 Aux Id: OTP-6834
STDLIB 1.14.5.2
改進和新功能
編譯器為了向前相容性,將會忽略 R12B 版本中引入的 -type() 和 -spec() 屬性。
Own Id: OTP-6834
STDLIB 1.14.5.1
已修復的錯誤和故障
log_mf_h 事件處理常式在完成讀取索引檔案後,未關閉索引檔案,導致檔案描述子洩漏。
自身 ID:OTP-6800
改進和新功能
dict:size/1 和 orddict:size/1 函數已記錄在文件中。
Own Id: OTP-6818
STDLIB 1.14.5
已修復的錯誤和故障
已修復 Dets 中關於比較 (==) 和比對 (=:=) 的錯誤。
STDLIB 手冊頁面已更新,以更仔細地說明何時比對和何時比較 term。
Own Id: OTP-4738 Aux Id: OTP-4685
已更新 shell 以修復以下缺陷:如果未使用 oldshell,shell 處理程序退出會讓您留下無回應的初始 shell。使用不存在的回呼模組啟動受限的 shell 會導致 shell 無法使用任何命令,即使是 init:stop/0 也不行。當 restricted_shell 處於活動狀態時,Fun 不能用作本機 shell 函數(在 shell_default 或 user_default 中)的參數。
Own Id: OTP-6537
已修復 QLC 的解析轉換中的錯誤。
Own Id: OTP-6590
已修復關於
lists:sort/1
和lists:keysort/2
以及浮點數和整數混合的錯誤。Own Id: OTP-6606
在 Erlang shell 中呼叫
erlang:garbage_collect/0
時,不僅會垃圾回收評估器處理程序(在 Erlang shell 中呼叫self/0
所傳回的處理程序),還會垃圾回收保存歷史記錄清單的處理程序。Own Id: OTP-6659
beam_lib
模組中過去會捕獲異常並返回元組{'EXIT',Reason}
的函數,現在會以原因Reason
退出。Own Id: OTP-6711
現在,每當評估運算符時(例外情況是
andalso
、orelse
和catch
),erl_eval
模組都會呼叫非本機函數處理程序。現在,當函數或運算符出現在保護測試中時,也會呼叫非本機函數處理程序(過去會忽略這些呼叫)。這些變更會影響在受限模式下執行的 Erlang shell:現在會為諸如
'!'/2
之類的運算符呼叫回呼函數non_local_allowed/3
。這表示可能需要變更non_local_allowed/3
,以允許運算符通過。請注意,為了停止 shell 中的訊息傳遞,必須限制erlang:'!'/2
以及erlang:send/2,3
。* 潛在的不相容性 *
Own Id: OTP-6714 Aux Id: seq10374
改進和新功能
新的編譯器選項
warn_obsolete_guard
可用於針對呼叫舊的類型測試 BIF 開啟警告。Own Id: OTP-6585
對於使用
escript
編寫的腳本,有一個新函數escript:script_name/0
,可用於檢索腳本的路徑名稱。關於預定義巨集(例如 ?MODULE 和模組名稱)的文件已進行說明。Own Id: OTP-6593
Makefile 的小幅變更。
Own Id: OTP-6689 Aux Id: OTP-6742
STDLIB 1.14.4
已修復的錯誤和故障
由
code:module_md5/1
、beam_lib:md5/1
和編譯器針對vsn
屬性的預設值所完成的 BEAM 檔案 MD5 計算已全部變更,因此其結果在所有平台上都相同;包含 fun 的模組在不同平台上可能會得到不同的 MD5。Own Id: OTP-6459
當使用
file_sorter
模組排序 term 時(Format
選項設定為term
),並非總是會正確處理檔案錯誤。此錯誤已修正。除非實際使用,否則不再檢查
tmpdir
選項提供的目錄。不再傳回錯誤原因not_a_directory
;而是傳回file_error
元組。Own Id: OTP-6526
已修復
erl_eval
模組中關於try
/catch
的錯誤。Own Id: OTP-6539
在排序 join 運算的運算元時,QLC 使用錯誤的引數呼叫
file:open/3
。此錯誤已修正。Own Id: OTP-6562 Aux Id: seq10606
改進和新功能
已更新函數
beam_lib:cmp/1
和beam_lib:strip/1
(以及類似的函數),以更通用的方式處理可選區塊(例如 "FunT"),以便未來相容。已新增函數
beam_lib:chunks/3
。已新增函數
beam_lib:md5/1
。Own Id: OTP-6443
將 base64 作為模組新增至 stdlib,用於編碼和解碼
Own Id: OTP-6470
將函數 to_upper/1 和 to_lower/1 新增至 string 模組。這些函數提供 ISO/IEC 8859-1 字元 (Latin1) 和字串的大小寫轉換。
Own Id: OTP-6472
現在,受限 shell 使用的回呼函數
non_local_allowed/3
可以傳回值{{restricted,NewFuncSpec,NewArgList},NewState}
,可用於讓 shell 呼叫指定的其他函數。Own Id: OTP-6497 Aux Id: seq10555
有一個新的
escript
程式,可用於以 Erlang 編寫腳本。Erlang 腳本不需要編譯,並且可以將任何引數傳遞給它們,而不會有被 Erlang 系統解譯的風險。Own Id: OTP-6505
現在允許函數
io:fwrite/2,3
和io_lib:fwrite/2
的Format
參數為二進制。專屬 ID:OTP-6517
STDLIB 1.14.3.1
修正錯誤與故障
函數
io:fwrite/2,3
和io_lib:fwrite/2
的Format
參數中的控制序列p
和P
,在應用於二進制時可能會導致badarg
失敗。此錯誤是在 STDLIB 1.14.3 中引入的。(感謝 Denis Bilenko。)專屬 ID:OTP-6495
改進和新功能
新增選項 {cwd, Dir},以便使用相對路徑名稱建立 zip 封存檔,而無需執行(全域)file:set_cwd。
專屬 ID:OTP-6491 輔助 ID:seq10551
STDLIB 1.14.3
修正錯誤與故障
在 Kernel 2.11.2 中引入的
spawn_opt/2,3,4,5
選項monitor
,目前在使用proc_lib
啟動程序時無法使用,也就是說,在啟動 gen_server、gen_fsm 等時也無法使用。此限制現已正確記錄,並且當提供此選項時,
gen_fsm
、gen_server
和proc_lib
的start
和start_link
函數的行為已從無限期掛起變更為以badarg
原因失敗。(感謝 Fredrik Linder)
專屬 ID:OTP-6345
改進和新功能
當達到最大深度時,函數
io:fwrite/2,3
和io_lib:fwrite/2
的Format
參數中的控制序列P
現在會將二進制字串的尾部替換為...
。例如,io:fwrite("~P", [<<"a binary string">>, 3]).
會印出<<"a binary"...>>
。縮排會更加小心,盡可能不超過右邊界。
如果在列印 tuple 時達到最大深度,則會印出
,...
而不是|...
(此變更也適用於控制序列W
)。專屬 ID:OTP-6354
Erlang shell 命令
h/0
會印出歷史記錄清單,現在會避免印出v/1
所參照的(巨大)term,而是只印出對v/1
的呼叫。專屬 ID:OTP-6390
STDLIB 1.14.2.2
修正錯誤與故障
函數
dets:select/1,3
、dets:match/1,3
和dets:match_object/1,3
已變更為永不傳回{[],Continuation}
。此變更會影響 Mnesia 中對應的函數。QLC 中已修正錯誤:如果
tmpdir
選項未指定有效的目錄,則qlc:info()
可能會崩潰;查找索引鍵的結果會保留在 RAM 中,這應該能提升效能。專屬 ID:OTP-6359
STDLIB 1.14.2.1
修正錯誤與故障
已修正
erl_pp:exprs()
中的錯誤。專屬 ID:OTP-6321 輔助 ID:seq10497
STDLIB 1.14.2
修正錯誤與故障
函數
io:format/2,3
和io_lib:format/2
的Format
參數中的控制序列p
和P
並未很好地處理二進制。此錯誤是在 stdlib-1.14 中引入的,現已修正。專屬 ID:OTP-6230
filelib:wildcard(Wc, PathWithRedundantSlashes)
,其中PathWithRedundantSlashes
是包含多餘斜線的目錄路徑,例如/tmp/
或//tmp
,可能會傳回不正確的結果。(感謝 Martin Bjorklund。)專屬 ID:OTP-6271
如果在模組宣告之前使用預先定義的巨集 ?MODULE 或 ?MODULE_STRING,Erlang 程式碼預處理器會崩潰。此錯誤已修正。
專屬 ID:OTP-6277
改進和新功能
已在
qlc
模組中新增對更快聯結兩個表格的支援。有兩種快速聯結:使用現有索引的查找聯結,以及取用兩個已排序輸入的合併聯結。有一個新的join
選項可用來強制 QLC 在某些 QLC 運算式中使用特定類型的聯結。還納入了其他幾個變更
cursor/2
、eval/2
、fold/4
和info/2
的新tmpdir
選項可用來設定聯結用於暫存檔的目錄。此選項也會覆寫keysort/3
和sort/2
的tmpdir
選項。新的
lookup
選項可用來斷言在評估某些 QLC 運算式時會查找常數。cache
和cache_all
選項接受新的標籤:ets
、list
和no
。如果答案無法保留在 RAM 中,則標籤list
會使用暫存檔在清單中快取答案。結合{cache,list}
和{unique, true}
等同於呼叫選項unique
設定為true
的sort/2
。為了回溯相容性,會識別舊標籤true
(等同於ets
)和false
(等同於no
)。新的選項
max_list_size
可用於設定合併聯結開始使用暫存檔來處理大型等價類別,以及清單中快取的答案放置在暫存檔上的限制。有一個新的回呼
is_sorted_key
作為選項提供給table/2
。QLC 會在嘗試尋找查找函數的常數時,分析每個 QLC 運算式。之前只分析具有一個產生器的 QLC 運算式。
請注意,只會分析產生器之後立即放置防護語法的篩選器。對防護篩選器的限制是不相容的變更。請參閱
qlc
以取得更多詳細資料。同樣地,可以使用多個用於遍歷 QLC 表格的符合規格,用於單一 QLC 運算式的不同產生器。
已修正錯誤:在快取足夠複雜的查詢的答案時,可能會發生某些答案未傳回的情況。
* 潛在的不相容性 *
專屬 ID:OTP-6038
當程式碼深度巢狀時,Erlang 格式化列印器 (
erl_pp
) 現在快得多。也修正了一些小錯誤。專屬 ID:OTP-6227 輔助 ID:OTP-5924
Erlang shell 現在會嘗試垃圾回收大型二進制。在某些情況下,否則這些二進制可能會無限期地持續存在。
專屬 ID:OTP-6239
為了協助 Dialyzer 尋找更多錯誤,Kernel 和 STDLIB 應用程式中的許多函數現在只接受文件中記載的類型之引數。
例如,
lists:prefix/2
和lists:suffix/2
函數記載為只接受清單作為其引數,但實際上它們接受任何內容並傳回false
。現在已變更,如果一個或兩個引數不是清單,則這些函數會導致例外狀況。此外,
string:strip/3
函數記載為採用字元引數,該引數是要從字串的一端或兩端移除的字元。如果給定的是清單而不是字元,則它過去不會執行任何動作,但現在會導致例外狀況。Dialyzer 會找到這些函數傳遞錯誤類型引數的大多數情況。
* 潛在的不相容性 *
專屬 ID:OTP-6295
STDLIB 1.14.1
修正錯誤與故障
呼叫
yecc:file/1,2
的函數c:y/1,2
現在會由c:help/0
列出。已在
c
中新增c:y/1,2
的文件。控制序列字元
s
可識別二進制和深度字元清單的事實已在io
中記載。此功能是在 R11B-0 (OTP-5403) 中新增的。專屬 ID:OTP-6140
shell 命令 rr() 有時無法從檔案讀取記錄定義。此問題已修正。
專屬 ID:OTP-6166 輔助 ID:OTP-5878
erl_eval
中的非本機函數處理常式,用於實作 Erlang shell 的受限模式,無法正確處理對erlang:apply/3
的呼叫。此錯誤已修正。專屬 ID:OTP-6169 輔助 ID:seq10374
當表格不是具名表格時,ets:rename/1 可能會死鎖或當機 SMP 模擬器。
ets:next/2 和 ets:prev/2 可能會在 SMP 模擬器上傳回錯誤的結果。
專屬 ID:OTP-6198 輔助 ID:seq10392, seq10415
在關閉 Dets 表格時,有時會以無法在不修復檔案的情況下開啟表格的方式儲存空間管理資料。此錯誤已修正。
專屬 ID:OTP-6206
STDLIB 1.14
修正錯誤與故障
QLC 中的錯誤修正:現在允許用於實作 QLC 表格的兩個回呼函數
TraverseFun
和LookupFun
傳回清單以外的 term。此 term 會立即作為目前查詢的結果傳回,主要用於傳回錯誤 tuple。也修正了其他幾個小錯誤。
專屬 ID:OTP-5195
STDLIB 模組
error_logger_file_h
和error_logger_tty_h
現在會從 SASL 應用程式讀取環境變數utc_log
。專屬 ID:OTP-5535
ets:info/1
已修正為符合文件描述的行為,並回傳元組列表,而非包含元組的元組。* 潛在的不相容性 *
自有 ID:OTP-5639
從現在開始,在記錄宣告的預設值中引用尚未宣告的記錄,將被程式碼檢查器視為錯誤。若記錄宣告的預設值使用或綁定變數,也會被視為錯誤。
* 潛在的不相容性 *
自有 ID:OTP-5878
當使用
-include_lib
引入.hrl
檔案時,引入路徑會暫時更新,包含找到該.hrl
檔案的目錄,這將允許該.hrl
檔案本身使用-include
從其所在目錄引入檔案。(感謝 Richard Carlsson。)自有 ID:OTP-5944
修正
filelib:ensure_dir/1
,該函式有時回傳true
,有時回傳ok
,現已修正為成功時一律回傳ok
。這與文件描述的true
相反,但ok
被認為是更合理的傳回值。* 潛在的不相容性 *
自有 ID:OTP-5960 輔助 ID:seq10240
現在,當在
{Module, Function}(ArgList)
形式的呼叫中使用記錄時,Shell 的處理效果更佳。自有 ID:OTP-5990 輔助 ID:OTP-5876
lists:ukeysort/2
和lists:ukeymerge/3
函式已變更,現在如果兩個元組的鍵值相同,則視為相等。為了保持一致性,
lists:usort/2
和lists:umerge/3
也已修改:如果兩個元素比較結果相等,則視為相等。file_sorter
模組也以類似方式修改:unique
選項現在適用於鍵值(keysort()
和keymerge()
)和排序函式({order, Order}
選項)。* 潛在的不相容性 *
自有 ID:OTP-6019
修正
ets:update_counter/3
的文件;如果要更新的計數器是鍵值,也會出現badarg
錯誤。自有 ID:OTP-6072
當使用
file_sorter
模組和排序函式對項目進行排序時,排序並不總是穩定的。此錯誤已修正。自有 ID:OTP-6088
改進與新功能
程式碼檢查器的改進
compile
屬性在函式定義後才會被識別。- 新的編譯器選項
nowarn_deprecated_function
可用於關閉對已棄用函式的呼叫警告。 - 新的編譯器選項
{nowarn_unused_function,[{Name,Arity}]}
會關閉針對所提及函式未使用的本機函式警告。新的選項{nowarn_deprecated_function,[{Module,Name,Arity}]}
和{nowarn_bif_clash,[{Name,Arity}]}
的運作方式類似。
Erlang 程式碼預處理器
epp
現在可識別file
屬性。此屬性旨在供 Yecc 等產生原始碼檔案的工具使用。自有 ID:OTP-5362
io:fwrite
和io_lib:fwrite
的格式化選項~s
已擴充為可處理二進位或 I/O 列表的引數。自有 ID:OTP-5403
io:format/2,3
和io_lib:format/2
函式的Format
引數的控制序列p
和P
已變更為顯示包含可列印字元的二進位內容,如同字串。自有 ID:OTP-5485
程式碼檢查器會針對在
export
屬性中匯出多次的函式發出警告。自有 ID:OTP-5494
新增了 STDLIB 手冊
stdlib(6)
。其中提及了 Erlang shell 的組態參數。自有 ID:OTP-5530
新增
zip
模組,其中包含用於讀取和建立 zip 壓縮檔的函式。請參閱zip
。自有 ID:OTP-5786
簡易的一對一監管者現在使用
dict
而非列表來儲存子程序的 PID。這顯著提高了存在許多動態監管子程序時的效能。(感謝 Mickaël Rémond 等人。)自有 ID:OTP-5898
當指定新的選項 '
strict_record_tests
' 時,編譯器會產生程式碼,在保護式中驗證 'R#record.field
' 操作的記錄類型。自 R10B 以來,已經產生驗證主體中記錄類型的程式碼,但在這個版本中,如果記錄驗證測試失敗,將會出現 '{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
程式碼檢查器對
deprecated
屬性的檢查,並未考慮到編譯選項export_all
。此錯誤已修正。自有 ID:OTP-5917
Erlang 美化列印器未正確處理
try/catch
。此錯誤已修正。自有 ID:OTP-5926
修正
lists:nthtail/3
的文件。新增
lists:keymap/3
的文件。嘗試在
lists
中釐清其他一些類型宣告和函式描述。修正
timer:now_diff/2
的文件。修正
gen_fsm
、gen_server
、io_lib
和lib(3)
中的損壞連結。自有 ID:OTP-5931
已將類型檢查新增至
lists.erl
中的函式。自有 ID:OTP-5939
改進與新功能
新的 STDLIB 模組
erl_expand_records
會在抽象程式碼中展開記錄。Erlang shell 會使用它,這表示 shell 不再使用編譯器。自有 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
修正的錯誤和故障
程式碼檢查器、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
建構。lists 模組中的高階函式不再接受任何情況下的錯誤函式。過去 '
lists:map(bad_fun, [])
' 會傳回 '[]
',但現在會導致例外狀況。已移除
ets
模組中未使用、損壞的相容性程式碼。(感謝 Dialyzer。)已消除 Dialyzer 在 Appmon 應用程式中發現的 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
建構式會建立一個 fun,指向M:F/A
的最新版本。此語法旨在取代有許多問題的元組 fun{M,F}
。新的類型測試
is_function(Fun,A)
(可在 guards 中使用) 測試Fun
是否為可使用A
個引數套用的 fun。(目前,Fun
也可以是元組 fun。)自有 ID:OTP-5584
STDLIB 1.13.7
修正的錯誤與故障
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
修正的錯誤與故障
當唯讀開啟 Dets 表格時,有時會嘗試重新雜湊表格,導致錯誤訊息。此問題已修正。
自有 ID:OTP-5487 輔助 ID:OTP-4989
改進與新功能
現在可以加密 Beam 檔案中的除錯資訊,以協助保持原始碼的機密性。請參閱
compile
的文件,了解如何提供加密金鑰;並參閱beam_lib
的文件,了解如何提供解密金鑰,以便使用除錯器、Xref 或 Cover 等工具。beam_lib:chunks/2
函數現在接受額外的區塊類型compile_info
,以直接以 term 形式擷取編譯資訊。(感謝 Tobias Lindahl。)自有 ID:OTP-5460 輔助 ID:seq9787
STDLIB 1.13.5
修正的錯誤與故障
如果無法寫入檔案,則關閉保存在 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:async_call/4
開始的呼叫已完成,否則rpc:yield/1
會當機;rpc:nb_yield(Key,infinity)
也會當機。清除並移除了 Dialyzer 在
erlang:dmonitor_p/2
中找到的冗餘程式碼。自有 ID:OTP-5462
STDLIB 1.13.4
修正的錯誤與故障
已修正 Erlang shell 中的錯誤。
自有 ID:OTP-5327
已移除 Dialyzer 回報的一些無用程式碼。
已修正追蹤到包裝追蹤檔案時
dbg
中的錯誤。當開始新的包裝追蹤時,它無法刪除任何已存在的同名包裝追蹤檔案。自有 ID:OTP-5329
linter 可能會輸出關於記錄初始化中位元模式的無效警告。此問題已修正。
自有 ID:OTP-5338
ordsets:is_set(NoList)
(其中NoList
是除列表以外的任何 term)會當機。為了與sets:is_set/1
和gb_sets:is_set/1
保持一致,現在會回傳false
。自有 ID:OTP-5341
已新增 BIF
erlang:raise/3
。請參閱手冊了解詳細資訊。它僅適用於內部系統程式設計、進階錯誤處理。自有 ID:OTP-5376 輔助 ID:OTP-5257
改進與新功能
linter 現在會檢查
deprecated
屬性。請參閱xref
以了解deprecated
屬性的描述。自有 ID:OTP-5276
如果使用者述詞回傳的值格式不正確,受限制的 shell 現在會指出。
自有 ID:OTP-5335
STDLIB 1.13.3
修正的錯誤與故障
已修正 linter 中關於未使用和被遮蔽變數的錯誤。
自有 ID:OTP-5091
已修正評估器中導致 shell 無法處理位元語法表達式的錯誤。
自有 ID:OTP-5237
對於格式字元 "g" 的某些精度和值組合,
io:format/2
等不再當機。先前,如果精度 P 為 4 或更低,且要列印的浮點數的絕對值低於 10^4 但高於或等於 10^(P-1),則會當機。現在它不會根據浮點數的值而當機。自有 ID:OTP-5263
已修正 Erlang shell 中關於處理位元語法的錯誤。
自有 ID:OTP-5269
gb_sets:del_element/2
已變更為與gb_sets:delete_any/2
相同,這才是原本的意圖,而不是與gb_sets:delete/2
相同。依賴gb_sets:del_element/2
如果元素不存在會導致錯誤的程式碼,必須變更為呼叫gb_sets:delete/2
。此文件更新了說明文件,明確記錄了先前僅以已記錄函數的「別名」提及的函數。此外,還新增了
gb_sets
、sets
和ordsets
共用的所有函數列表。* 潛在的不相容性 *
自有編號:OTP-5277
已從 QLC 模組中移除除錯訊息。
自有編號:OTP-5283
改進和新功能
已減少從
dets:match/1,3
、dets:match_object/1,3
和dets:select/1,3
返回的續傳大小。這會影響 Mnesia 在評估 QLC 查詢時節點之間傳送的資料量。自有編號:OTP-5232
STDLIB 1.13.2
改進和新功能
用於啟動遠端 shell 的
-rsh
開關(隨 OTP-5210 引入)與slave
已使用的現有開關衝突。因此,遠端 shell 的開關現在改名為-remsh
。自有編號:OTP-5248,輔助編號:OTP-5210
STDLIB 1.13.1
已修正的錯誤和故障
Pman 的「追蹤 shell」功能已損壞,現已修復。此外,如果節點上有多個 shell 程序正在執行,Pman 無法正確找到活動 shell 的 PID。此問題也已修正。
自有編號:OTP-5191
當使用未記載的「參數化模組」功能時,?MODULE 巨集無法正常運作。
自有編號:OTP-5224
改進和新功能
您現在可以使用
-rsh
標誌啟動 Erlang,這會為您提供遠端初始 shell,而不是本機 shell。範例:erl -sname this_node -rsh other_node@other_host
自有編號:OTP-5210
已更新
lists
模組的手冊頁面,新增對新的zip
、unzip
和partition/2
函數的描述。自有編號:OTP-5213
在 JCL 模式下,頂層群組領導者過去會列為工作清單中的工作 #1。由於沒有與此程序相關聯的 shell 可連接,因此將不再列出。
自有編號:OTP-5214
為了保持向後相容性,已重新引入與系統其餘部分並行啟動 Erlang shell 的可能性。請注意,這種舊行為容易出錯,除非有必要,否則不應使用。
自有編號:OTP-5218,輔助編號:seq9534
shell
命令rr/1,2,3
現在在從 BEAM 檔案讀取記錄定義時接受萬用字元。自有編號:OTP-5226