[erlang-patches] [patch] binary to/from integer
Loïc Hoguin
essen@REDACTED
Fri Jan 11 16:44:32 CET 2013
On 01/11/2013 03:01 PM, Björn-Egil Dahlberg wrote:
> On 2013-01-11 09:33, Bengt Kleberg wrote:
>> Greetings,
>>
>> FWIW I would like to not autoimport any more functions. The existing
>> ones are confusing enough when reading up on new code.
> I agree.
>
> Hence why I would like to put new BIF functions in other modules.
>
> The only argument for having a binary_to_integer and friend
> auto-imported is by friendship to list_to_integer and such functions.
> Since those functions are auto-imported these ones should be too.
>
> The argument is mute if we change the module I think.
By friendship? That's a weird way to say it.
This is *consistency*.
There are a number of base types in Erlang, including atom(), integer(),
float(), list() and binary(). (list() here is generally thought to be
string() when it is converted from/to other types, integer_to_list/1
really isn't the best name for it).
One would expect conversion from one type to another to be easy to use,
efficient and also fast. One would also expect some cases to be edge
cases, for example atom to integer, so these do not need a direct
conversion mechanism. A developer surely understands that if he does
something unusual he'll have to go through more hoops to get his job done.
Let's take a look at these types and the current state of the API.
atom()
to_integer: edge case
to_float: edge case
to_list: available, but means to_string
to_binary: available, encoding is required as a 2nd argument
When we get UTF-8 atoms, people will start expecting an atom_to_binary/1
that aliases atom_to_binary/2 with utf8 as default argument.
integer()
to_atom: edge case
to_float: edge case
to_list: available, but means to_string, can also specify base
to_binary: list_to_binary(integer_to_list(I)), inconvenient
float()
to_atom: edge case
to_float: edge case
to_list: available, but means to_string
to_binary: list_to_binary(float_to_list(F)), inconvenient
Of note is that floats are rarely used in Erlang, so perhaps
float_to_binary/1 isn't really needed.
list()
to_atom: available, also in a safe form
to_float: yep
to_integer: yep, also with base
to_binary: yep
You can convert everything to list, but in all cases it means string().
binary()
to_atom: available, need to specify encoding, safe form available
to_float: list_to_float(binary_to_list(B)), inconvenient
to_integer: list_to_integer(binary_to_list(B)), inconvenient
to_list: available, but means to_string
This shows a number of issues and shortcomings.
The biggest one is that when you write 'list' when converting from one
type to another, you always mean 'string'. I suppose this is historical,
but it's part of what makes string handling in Erlang so difficult.
Another is that today, I need to think when converting binary strings to
integer, because you write it:
intermediate_to_final(initial_to_intermediate(Value))
So everytime I perform a double conversion I have high chances to
introduce a bug and waste time.
Tomorrow, I could be using these functions:
* list_to_atom/1
* list_to_integer/1
* list_to_float/1
* binary:from_list/1
One would expect list_to_binary/1 here. Because that would be consistent
(but semantically not exact as you convert a string(), not any list()).
If auto-imported BIFs are a problem, perhaps a slow move to a single BIF
for example to(ToType, Value) could be beneficial.
I'd much rather write to(binary, 123) than any of the alternatives or
current proposals including integer_to_binary. It loses the feature that
integer_to_binary would check that the value is an integer first, but I
don't think it's often counted on in people's code so that could be done
separately for the rare cases where it's actually needed.
It would also fix the consistency issues, would allow fixing the
semantics of list actually meaning string, and a to/3 version could take
options as a third argument for the cases where encoding or checking for
atom existence are necessary. It would also be easier to add another
type later on.
--
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu
More information about the erlang-patches
mailing list