作者
Sergey Prokhorov <seriy(點)pr(在)gmail(點)com>
狀態
已接受/23.0 已實作於 OTP 版本 23
類型
標準追蹤
建立日期
2019-10-07
Erlang 版本
OTP-23.0

EEP 51: 數字字面值中的底線數字分隔符號 #

摘要 #

此 EEP 擴展了數字字面值的語法,允許使用底線 _ 作為數字分隔符號。它擴展了整數、浮點數和基數整數字面值的語法。

版權 #

本文档已置于公共领域。

規範 #

目前數字字面值的語法可以使用以下模式描述

DIGIT = [0-9]
BASE_DIGIT = [0-9a-zA-Z]
SIGN = [+-]

INTEGER = SIGN? DIGIT+

FLOAT = SIGN? DIGIT+ '.' DIGIT+ ('e' SIGN? DIGIT+)?

BASED_INTEGER = SIGN? DIGIT+ '#' BASE_DIGIT+

EEP 擴展此語法,允許單個底線 _ 字元作為兩個 DIGITBASE_DIGIT 字元之間的分隔符號。也就是說,_ 的左側和右側的字元都應該是數字。不允許前導、後綴或重複的底線,以及緊鄰 - . # e 的底線。分隔符號僅用於視覺上分隔字符組。它不會改變字面值的語義,並由詞法分析器刪除。

以下是有效數字字面值的範例

123_456
1_2_3_4_5
123_456.789_123
1.0e1_23
16#DEAD_BEEF
2#1100_1010_0011

以下是不允許的字面值範例

_123  % will be interpreted as variable name
123_
123__456  % only single underscore allowed
123_.456  % underscore can only separate digits, not other symbols
123._456
16#_1234
16#1234_

當將抽象形式或項表示為字串時(erl_ppio_lib),底線將會被遺失。

動機 #

對於相對較長的字面值,例如十進制的千位分隔符號 Million = 1_000_000SecondsInDay = 86_400,十六進制的位元組分隔符號 16#DEAD_BEEF_CAFE,數字分隔符號會變得特別方便。群組分隔符號(在明智使用時)可以使這些字面值更具可讀性,並且更容易在視覺上發現拼寫錯誤,例如 MicroSecond = Second * 100000。數字分隔符號功能已被多種程式語言採用,最早可以追溯到 Ada83。

基本原理 #

選擇底線字元作為分隔符號是因為它被其他多種語言使用,例如 “Ada 83”、“C#”、“Java 7”、“Perl 2.0”、“Python 3.6”、“Ruby”、“Rust”、“Swift” 和 “Go”。此外,它不會與目前的 Erlang 語法衝突(與例如 , 不同)。唯一模稜兩可的決定是關於應該在何處允許數字分隔符號。決定底線應該僅在數字之間允許,如其作為“數字分隔符號”的含義所示。

向後相容性 #

所有現有的 Erlang 程式碼仍然可以接受。實作完全在 Erlang 詞法分析器中完成,因此,不需要在剖析器中進行任何更改,甚至檢查 AST 的工具也不會受到影響。外部工具,如程式碼編輯器和語法高亮器,可能需要更新才能識別數字字面值的新語法。

參考實作 #

參考實作以 GitHub 上的 pull-request 形式提供

https://github.com/erlang/otp/pull/2324