<div dir="ltr"><div>It was also submitted as PR on GitHub <a href="https://github.com/erlang/eep/pull/7">https://github.com/erlang/eep/pull/7</a></div><div><br></div><div>    Author: Sergey Prokhorov <seriy(dot)pr(at)gmail(dot)com></div>    Status: Draft<br>    Type: Standards Track<br>    Erlang-Version: 23.0<br>    Created: 07-Oct-2019<br>    Post-History:<br>****<br>EEP 51: Underscore digit separator in numeric literals<br>----<br><br><br>Abstract<br>========<br><br>This EEP extends numeric literal syntax, allowing underscore `_` as digits<br>separator. It extends syntax of integer, float and based integer literals.<br><br><br>Copyright<br>=========<br><br>This document has been placed in the public domain.<br><br><br>Specification<br>=============<br><br>Current syntax for numeric literals can be described by following scheme:<br><br><br>    DIGIT = [0-9]<br>    BASE_DIGIT = [0-9a-zA-Z]<br>    SIGN = [+-]<br>    <br>    INTEGER = SIGN? DIGIT+<br>    <br>    FLOAT = SIGN? DIGIT+ '.' DIGIT+ ('e' SIGN? DIGIT+)?<br>    <br>    BASED_INTEGER = SIGN? DIGIT+ '#' BASE_DIGIT+<br><br><br>EEP extends this syntax by allowing single underscore `_` character as a<br>separator between two `DIGIT` or `BASE_DIGIT` characters. I.e., characters from<br>both left and right sides of `_` should be digits. Leading, trailing or repeated<br>underscores should not be allowed as well as underscores next to `-` `.` `#` `e`.<br>Separator is only used to visually separate groups of characters. It doesn't<br>change semantics of literal and is removed by lexer.<br><br>Following are examples of valid numeric literals:<br><br><br>    123_456<br>    1_2_3_4_5<br>    123_456.789_123<br>    1.0e1_23<br>    16#DEAD_BEEF<br>    2#1100_1010_0011<br><br><br>And following are examples of literals that are not allowed:<br><br><br>    _123  % will be interpreted as variable name<br>    123_<br>    123__456  % only single underscore allowed<br>    123_.456  % underscore can only separate digits, not other symbols<br>    123._456<br>    16#_1234<br>    16#1234_<br><br><br>The underscores are to be lost when representing abstract forms or terms as<br>strings (`erl_pp`, `io_lib`).<br><br><br>Motivation<br>==========<br><br>Digit separator becomes especially handy for relatively long literals like<br>thousands separator for decimals `Million = 1_000_000`, `SecondsInDay = 86_400`<br>byte separator for hexadecimal `16#DEAD_BEEF_CAFE`. Group separator makes<br>such literals more readable (when used wisely) and makes it easier to visualy<br>spot typos like `MicroSecond = Second * 100000`.<br>The digit separator feature was adopted by multiple programming languages<br>starting from at least Ada83.<br><br><br>Rationale<br>=========<br><br>Underscore character was choosen as separator because it is used by multiple<br>other languages such as "Ada 83", "C#", "Java 7", "Perl 2.0", "Python 3.6",<br>"Ruby", "Rust", "Swift" and "Go". Also it doesn't conflict with current Erlang<br>syntax (unlike, for example, `,`).<br>The only ambiguous decision was about where exactly digit separators should be<br>allowed. It was decided that underscore should be allowed only between digits<br>as meant by being a "digit separator".<br><br><br>Backwards Compatibility<br>=======================<br><br>All existing Erlang code remains acceptable. The implementation is done<br>entirely in the Erlang lexer, so, no changes are needed in parser and<br>even tools that examine ASTs will be unaffected.<br>External tools like code editors and syntax highlighters might need to be<br>updated to be able to recognize new syntax for numeric literals.<br><br><br>Reference Implementation<br>========================<br><br>The reference implementation is provided in a form of pull-request on GitHub<br><br>    <a href="https://github.com/erlang/otp/pull/2324">https://github.com/erlang/otp/pull/2324</a><br><br></div>