digitalmars.D.learn - operator "~" does not check type?
- Cheng Wei (4/4) Oct 12 2011 The following expression compiles but does not make sense.
- bearophile (4/8) Oct 12 2011 I'd call it trash-feature :-|
- Jonathan M Davis (5/11) Oct 12 2011 int and dchar implicitly convert to one another for better or for worse....
- bearophile (9/12) Oct 12 2011 char->int is OK, but int->char is not so OK. This programs (that compile...
- Jonathan M Davis (8/23) Oct 12 2011 I believe that the primary reasoning for allowing the implicit conversio...
- Trass3r (4/7) Oct 12 2011 That's a '+' though, not a '~'.
- Steven Schveighoffer (8/17) Oct 12 2011 Jonathan meant this better example ;)
- Cheng Wei (8/26) Oct 13 2011 It's still fine if '~' does not allow implicit casting but '+' does.
- Steven Schveighoffer (7/22) Oct 13 2011 A + B where the types of A and B are integral goes through integer
- Timon Gehr (4/26) Oct 16 2011 Another argument for requiring an explicit cast is that not every int
- Steven Schveighoffer (13/38) Oct 17 2011 Hm... int can hold all dchar values, so I'd expect it to promote to int ...
- deadalnix (4/9) Oct 12 2011 In D, the conversion is implicit if the compiler can detect it is same
The following expression compiles but does not make sense. string str = "hello" ~ 10; assert(str == "hello\n"); Is this a useful feature or just a bug?
Oct 12 2011
Cheng Wei:string str = "hello" ~ 10; assert(str == "hello\n"); Is this a useful feature or just a bug?I'd call it trash-feature :-| Bye, bearophile
Oct 12 2011
On Wednesday, October 12, 2011 07:08:05 Cheng Wei wrote:The following expression compiles but does not make sense. string str = "hello" ~ 10; assert(str == "hello\n"); Is this a useful feature or just a bug?int and dchar implicitly convert to one another for better or for worse. Personally, I'd prefer that they didn't, but that's the way that it is, so I don't believe that this is technically a bug. - Jonathan M Davis
Oct 12 2011
Jonathan M Davis:int and dchar implicitly convert to one another for better or for worse. Personally, I'd prefer that they didn't, but that's the way that it is, so I don't believe that this is technically a bug.char->int is OK, but int->char is not so OK. This programs (that compiles with no errors) seems to show a possible source of bugs, so I call this a design bug, worth fixing: void main(string[] args) { int x = args.length; string s = "hello"; s ~= x; } Bye, bearophile
Oct 12 2011
On Wednesday, October 12, 2011 03:53:22 bearophile wrote:Jonathan M Davis:I believe that the primary reasoning for allowing the implicit conversion between int and dchar is so that code like this dchar c = 'a' + 7; doesn't require a cast. So, the primary target is converting to int to dchar. Regardless, when it's come up before, Walter has been very much against changing it. - Jonathan M Davisint and dchar implicitly convert to one another for better or for worse. Personally, I'd prefer that they didn't, but that's the way that it is, so I don't believe that this is technically a bug.char->int is OK, but int->char is not so OK. This programs (that compiles with no errors) seems to show a possible source of bugs, so I call this a design bug, worth fixing: void main(string[] args) { int x = args.length; string s = "hello"; s ~= x; }
Oct 12 2011
I believe that the primary reasoning for allowing the implicit conversion between int and dchar is so that code like this dchar c = 'a' + 7;That's a '+' though, not a '~'. I think it shouldn't be allowed with ~ since it's misleading. Newbies would probably expect "abc" ~ 10 to yield "abc10" rather than the odd "abc\n".
Oct 12 2011
On Wed, 12 Oct 2011 09:46:57 -0400, Trass3r <un known.com> wrote:Jonathan meant this better example ;) string s = "hello"; s ~= 'a' + 7;I believe that the primary reasoning for allowing the implicit conversion between int and dchar is so that code like this dchar c = 'a' + 7;That's a '+' though, not a '~'.I think it shouldn't be allowed with ~ since it's misleading. Newbies would probably expect "abc" ~ 10 to yield "abc10" rather than the odd "abc\n".100% agree. Requiring a cast in order to convert to dchar is a small price to pay (not that common to do arithmetic with characters) for avoiding surprising compilations. -Steve
Oct 12 2011
== Quote from Steven Schveighoffer (schveiguy yahoo.com)'s articleOn Wed, 12 Oct 2011 09:46:57 -0400, Trass3r <un known.com> wrote:It's still fine if '~' does not allow implicit casting but '+' does. 'a' + 7 -> 'h' which is already a dchar. So it can be appended to s without casting. Now the question is how easy it is to allow implicit casting for some operators but not other operators.Jonathan meant this better example ;) string s = "hello"; s ~= 'a' + 7;I believe that the primary reasoning for allowing the implicit conversion between int and dchar is so that code like this dchar c = 'a' + 7;That's a '+' though, not a '~'.thanI think it shouldn't be allowed with ~ since it's misleading. Newbies would probably expect "abc" ~ 10 to yield "abc10" rathersmallthe odd "abc\n".100% agree. Requiring a cast in order to convert to dchar is aprice to pay (not that common to do arithmetic with characters) for avoiding surprising compilations. -Steve
Oct 13 2011
On Thu, 13 Oct 2011 06:57:09 -0400, Cheng Wei <rivercheng gmail.com> wrote:== Quote from Steven Schveighoffer (schveiguy yahoo.com)'s articleA + B where the types of A and B are integral goes through integer promotion rules, inherited from C. Like them or not, they are very unlikely to change. This means dchar + int promotes to int, not dchar. I think requiring a cast to go from int to dchar would be fine. It's not a very common operation, and it clearly causes novice issues. -SteveOn Wed, 12 Oct 2011 09:46:57 -0400, Trass3r <un known.com> wrote:It's still fine if '~' does not allow implicit casting but '+' does. 'a' + 7 -> 'h' which is already a dchar. So it can be appended to s without casting.Jonathan meant this better example ;) string s = "hello"; s ~= 'a' + 7;I believe that the primary reasoning for allowing the implicit conversion between int and dchar is so that code like this dchar c = 'a' + 7;That's a '+' though, not a '~'.
Oct 13 2011
On 10/13/2011 01:46 PM, Steven Schveighoffer wrote:On Thu, 13 Oct 2011 06:57:09 -0400, Cheng Wei <rivercheng gmail.com> wrote:Actually uint afaik.== Quote from Steven Schveighoffer (schveiguy yahoo.com)'s articleA + B where the types of A and B are integral goes through integer promotion rules, inherited from C. Like them or not, they are very unlikely to change. This means dchar + int promotes to int, not dchar.On Wed, 12 Oct 2011 09:46:57 -0400, Trass3r <un known.com> wrote:It's still fine if '~' does not allow implicit casting but '+' does. 'a' + 7 -> 'h' which is already a dchar. So it can be appended to s without casting.Jonathan meant this better example ;) string s = "hello"; s ~= 'a' + 7;I believe that the primary reasoning for allowing the implicit conversion between int and dchar is so that code like this dchar c = 'a' + 7;That's a '+' though, not a '~'.I think requiring a cast to go from int to dchar would be fine. It's not a very common operation, and it clearly causes novice issues.Another argument for requiring an explicit cast is that not every int can be converted to a valid dchar.
Oct 16 2011
On Sun, 16 Oct 2011 18:24:26 -0400, Timon Gehr <timon.gehr gmx.ch> wrote:On 10/13/2011 01:46 PM, Steven Schveighoffer wrote:Hm... int can hold all dchar values, so I'd expect it to promote to int before uint. testing: void main() { dchar d; auto x = d + 5; pragma(msg, typeof(x).stringof); } outputs: uint so you are right! Seems like an oversight... -SteveOn Thu, 13 Oct 2011 06:57:09 -0400, Cheng Wei <rivercheng gmail.com> wrote:Actually uint afaik.== Quote from Steven Schveighoffer (schveiguy yahoo.com)'s articleA + B where the types of A and B are integral goes through integer promotion rules, inherited from C. Like them or not, they are very unlikely to change. This means dchar + int promotes to int, not dchar.On Wed, 12 Oct 2011 09:46:57 -0400, Trass3r <un known.com> wrote:It's still fine if '~' does not allow implicit casting but '+' does. 'a' + 7 -> 'h' which is already a dchar. So it can be appended to s without casting.Jonathan meant this better example ;) string s = "hello"; s ~= 'a' + 7;I believe that the primary reasoning for allowing the implicit conversion between int and dchar is so that code like this dchar c = 'a' + 7;That's a '+' though, not a '~'.
Oct 17 2011
Le 12/10/2011 09:53, bearophile a écrit :Jonathan M Davis:In D, the conversion is implicit if the compiler can detect it is same via bound checking. Here, the compiler can deduce that the int 10 is between 10 and 10 so can be safely converted.int and dchar implicitly convert to one another for better or for worse. Personally, I'd prefer that they didn't, but that's the way that it is, so I don't believe that this is technically a bug.char->int is OK, but int->char is not so OK. This programs (that compiles with no errors) seems to show a possible source of bugs, so I call this a design bug, worth fixing:
Oct 12 2011