Re: Can we disallow appending integer to string?

2017-04-21 Thread Nick Treleaven via Digitalmars-d-learn

On Friday, 21 April 2017 at 08:36:12 UTC, Nick Treleaven wrote:
Converting from char types -> integers, whilst (arguably) bug 
prone, at least is numerically sound. So perhaps we could 
disallow uint -> dchar, which is unsound.


That is in the general case - when VRP can prove an integer fits 
within a dchar, by the logic of this proposal, it is allowed.


Re: Can we disallow appending integer to string?

2017-04-21 Thread Nick Treleaven via Digitalmars-d-learn

On Thursday, 20 April 2017 at 11:05:00 UTC, Nick Treleaven wrote:
On Wednesday, 19 April 2017 at 14:50:38 UTC, Stanislav Blinov 
wrote:
Because integrals implicitly convert to characters of same 
width (byte -> char, short -> wchar, int -> dchar).


Despite char.min > byte.min, char.max < byte.max.


The above mismatches would presumably be handled if we disallow 
implicit conversion between signed/unsigned 
(https://issues.dlang.org/show_bug.cgi?id=12919).


I would like to see some small changes to mitigate against 
things like this, even if we can't agree to prevent the 
conversion overall.


It seems there's a strong case for preventing the int -> dchar 
conversion. wchar.max == ushort.max, char.max == ubyte.max, but 
dchar.max < uint.max.


Converting from char types -> integers, whilst (arguably) bug 
prone, at least is numerically sound. So perhaps we could 
disallow uint -> dchar, which is unsound.


Re: Can we disallow appending integer to string?

2017-04-21 Thread XavierAP via Digitalmars-d-learn
On Wednesday, 19 April 2017 at 14:50:38 UTC, Stanislav Blinov 
wrote:

On Wednesday, 19 April 2017 at 14:36:13 UTC, Nick Treleaven


Why is it legal to append an integer?


Because integrals implicitly convert to characters of same 
width (byte -> char, short -> wchar, int -> dchar).


Huh... I hadn't used but I'd been assuming probably biased from 
C# that

str ~ i
would be equivalent to
str ~ to!string(i)
instead of
str ~ cast(char) i

Now I see the problem too...


Re: Can we disallow appending integer to string?

2017-04-20 Thread H. S. Teoh via Digitalmars-d-learn
On Thu, Apr 20, 2017 at 10:39:01PM +, Stanislav Blinov via 
Digitalmars-d-learn wrote:
> On Thursday, 20 April 2017 at 19:20:28 UTC, H. S. Teoh wrote:
> 
> 
> > Another pernicious thing I encountered recently, related to implicit
> > conversions, is this:
> > 
> > https://issues.dlang.org/show_bug.cgi?id=17336
> > 
> > It drew a very enunciated "WAT?!" from me.
> 
> Yeah, that one is annoying. I've dealt with this before with:
> 
> alias OpResult(string op, A, B) = typeof((){ A* a; B* b; return
> mixin("*a"~op~"*b"); }());

Yeah, wow, that is very annoying.


T

-- 
Debian GNU/Linux: Cray on your desktop.


Re: Can we disallow appending integer to string?

2017-04-20 Thread Stanislav Blinov via Digitalmars-d-learn

On Thursday, 20 April 2017 at 19:20:28 UTC, H. S. Teoh wrote:


Another pernicious thing I encountered recently, related to 
implicit conversions, is this:


https://issues.dlang.org/show_bug.cgi?id=17336

It drew a very enunciated "WAT?!" from me.


Yeah, that one is annoying. I've dealt with this before with:

alias OpResult(string op, A, B) = typeof((){ A* a; B* b; return 
mixin("*a"~op~"*b"); }());




Re: Can we disallow appending integer to string?

2017-04-20 Thread Nick Sabalausky (Abscissa) via Digitalmars-d-learn

On 04/19/2017 01:34 PM, Jonathan M Davis via Digitalmars-d-learn wrote:


Yeah, which reduces the number of casts required when doing arithmetic on
characters and thus reduces bugs there,


Ugh, because apparently doing arithmetic on characters is such a common, 
important use-case in this modern unicode world... :/




Re: Can we disallow appending integer to string?

2017-04-20 Thread H. S. Teoh via Digitalmars-d-learn
On Thu, Apr 20, 2017 at 11:05:00AM +, Nick Treleaven via 
Digitalmars-d-learn wrote:
[...]
> This is also a problem for overloading:
> 
> alias foo = (char c) => 1;
> alias foo = (int i) => 4;
> 
> static assert(foo(7) == 4); // fails
> 
> I would like to see some small changes to mitigate against things like
> this, even if we can't agree to prevent the conversion overall. It
> would be nice if we filed a bug as a rallying point for ideas on this
> issue.

+1.  Recently I was bitten by the char/int overload ambiguity problem,
and it was not pretty. Well, actually, it was worse in my case because I
had overloaded char against ubyte. Basically the only way I can
disambiguate is to wrap one of them in a struct to force the compiler to
treat them differently.

Another pernicious thing I encountered recently, related to implicit
conversions, is this:

https://issues.dlang.org/show_bug.cgi?id=17336

It drew a very enunciated "WAT?!" from me.


T

-- 
Gone Chopin. Bach in a minuet.


Re: Can we disallow appending integer to string?

2017-04-20 Thread Nick Treleaven via Digitalmars-d-learn
On Wednesday, 19 April 2017 at 14:50:38 UTC, Stanislav Blinov 
wrote:
Because integrals implicitly convert to characters of same 
width (byte -> char, short -> wchar, int -> dchar).


Despite char.min > byte.min, char.max < byte.max. Anyway, 
appending an integer is inconsistent because concatenation is not 
allowed:


int n;
string s;
s = "" ~ n; //error
s ~= n; // ok!

This is the same for dchar instead of int.

This is also a problem for overloading:

alias foo = (char c) => 1;
alias foo = (int i) => 4;

static assert(foo(7) == 4); // fails

I would like to see some small changes to mitigate against things 
like this, even if we can't agree to prevent the conversion 
overall. It would be nice if we filed a bug as a rallying point 
for ideas on this issue.


Re: Can we disallow appending integer to string?

2017-04-19 Thread Stanislav Blinov via Digitalmars-d-learn

On Wednesday, 19 April 2017 at 18:40:23 UTC, H. S. Teoh wrote:

A few extra keystrokes to type cast(int) or cast(char) ain't 
gonna kill nobody. In fact, it might even save a few people by 
preventing certain kinds of bugs.


Yup. Not to mention one could have

@property
auto numeric(Flag!"unsigned" unsigned = No.unsigned, C)(C c) 
if(isSomeChar!C)

{
return cast(IntOfSize!(C.sizeof, unsigned))c;
}

auto v = 'a'.numeric;

...or even have an equivalent as a built-in property of character 
types...


Re: Can we disallow appending integer to string?

2017-04-19 Thread H. S. Teoh via Digitalmars-d-learn
On Wed, Apr 19, 2017 at 05:56:18PM +, Stanislav Blinov via 
Digitalmars-d-learn wrote:
> On Wednesday, 19 April 2017 at 17:34:01 UTC, Jonathan M Davis wrote:
> > Personally, I think that we should have taken the stricter approach
> > and not had integral types implicit convert to character types, but
> > from what I recall, Walter feels pretty strongly about the
> > conversion rules being the way that they are.
> 
> Yep, me too. Generally, I don't think that an implicit conversion (T :
> U) should be allowed if T.init is not equivalent to U.init.

Me three.

Implicit conversion of int to char/dchar/etc. is a horrible, horrible
idea that leads to hard-to-find bugs. The whole point of having a
separate type for char vs. ubyte, unlike in C where char pretty much
means byte/ubyte, is so that we can keep their distinctions straight,
not to continue to confuse them in the typical C manner by having their
distinction blurred by implicit casts.

Personally, I would rather have arithmetic on char (wchar, dchar)
produce results of the same type, so that no implicit conversions are
necessary.  It seems to totally make sense to me to have to explicitly
ask for a character's numerical value -- it documents code intent, which
often also helps the programmer clear his head and avoid mistakes that
would otherwise inevitably creep in. A few extra keystrokes to type
cast(int) or cast(char) ain't gonna kill nobody. In fact, it might even
save a few people by preventing certain kinds of bugs.


T

-- 
Gone Chopin. Bach in a minuet.


Re: Can we disallow appending integer to string?

2017-04-19 Thread Stanislav Blinov via Digitalmars-d-learn
On Wednesday, 19 April 2017 at 17:34:01 UTC, Jonathan M Davis 
wrote:


Personally, I think that we should have taken the stricter 
approach and not had integral types implicit convert to 
character types, but from what I recall, Walter feels pretty 
strongly about the conversion rules being the way that they are.


Yep, me too. Generally, I don't think that an implicit conversion 
(T : U) should be allowed if T.init is not equivalent to U.init.





Re: Can we disallow appending integer to string?

2017-04-19 Thread Jonathan M Davis via Digitalmars-d-learn
On Wednesday, April 19, 2017 14:50:38 Stanislav Blinov via Digitalmars-d-
learn wrote:
> On Wednesday, 19 April 2017 at 14:36:13 UTC, Nick Treleaven wrote:
> > This bug is fixed as the code no longer segfaults but throws
> > instead:
> > https://issues.dlang.org/show_bug.cgi?id=5995
> >
> > void main(){
> >
> > string ret;
> > int i = -1;
> > ret ~= i;
> >
> > }
> >
> > Why is it legal to append an integer?
>
> Because integrals implicitly convert to characters of same width
> (byte -> char, short -> wchar, int -> dchar).

Yeah, which reduces the number of casts required when doing arithmetic on
characters and thus reduces bugs there, and I believe that that's the main
reason the implicit conversion from an integral type to a character type
exists. So, having the implicit conversion fixes one set of bugs, and
disallowing it fixes another. We have similar problems with bool.

Personally, I think that we should have taken the stricter approach and not
had integral types implicit convert to character types, but from what I
recall, Walter feels pretty strongly about the conversion rules being the
way that they are.

- Jonathan M Davis



Re: Can we disallow appending integer to string?

2017-04-19 Thread Stanislav Blinov via Digitalmars-d-learn

On Wednesday, 19 April 2017 at 14:36:13 UTC, Nick Treleaven wrote:
This bug is fixed as the code no longer segfaults but throws 
instead:

https://issues.dlang.org/show_bug.cgi?id=5995

void main(){
string ret;
int i = -1;
ret ~= i;
}

Why is it legal to append an integer?


Because integrals implicitly convert to characters of same width 
(byte -> char, short -> wchar, int -> dchar).