[eeps] EEP-51: Underscore digit separator in numeric literals

Raimo Niskanen raimo+eeps@REDACTED
Thu Oct 10 11:58:01 CEST 2019


On Thu, Oct 10, 2019 at 01:50:22AM +0200, Сергей Прохоров wrote:
> It was also submitted as PR on GitHub https://github.com/erlang/eep/pull/7

I merged the pull request, which I presume is identical to the text below,
making only a syntactical change of [VimVar]: at the end.

Available at:

    http://erlang.org/eeps/eep-0000.html
    https://github.com/erlang/eep/blob/master/eeps/eep-0051.md

/ Raimo Niskanen, EEP Editor at erlang dot org


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

> _______________________________________________
> eeps mailing list
> eeps@REDACTED
> http://erlang.org/mailman/listinfo/eeps


-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB



More information about the eeps mailing list