此 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 擴展此語法,允許單個底線 _
字元作為兩個 DIGIT
或 BASE_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_pp
、io_lib
),底線將會被遺失。
對於相對較長的字面值,例如十進制的千位分隔符號 Million = 1_000_000
、SecondsInDay = 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