digitalmars.D.learn - Problem with using && as shorthand for if
- Ersin Er (10/10) Aug 20 2010 Hi,
- Ersin Er (2/2) Aug 20 2010 I forgot to mention that I am using dmd 2.048 on Ubuntu 10.04
- div0 (9/19) Aug 20 2010 The return type of writeln is void.
- Jonathan M Davis (13/43) Aug 20 2010 It's legal according to TDPL. It seems to be intended to be used as a sh...
- div0 (8/20) Aug 20 2010 Then Andrei has taken leave of his senses and this is one situation
- Jonathan M Davis (19/24) Aug 20 2010 Well, Andrei is definitely a fan of using D for small scripts, so argume...
- bearophile (5/9) Aug 20 2010 Even small scripts need to be tidy. And I don't like that stupid shortcu...
- Jonathan M Davis (4/20) Aug 20 2010 It's essentially the same as putting an entire if statement on one line,...
- Ersin Er (6/34) Aug 20 2010 If Andrei is wrond and DMD is right, then the first example should not h...
- Ersin Er (23/53) Aug 20 2010 Then the first code should not compile too. By the way here is what Andr...
- Iain Buclaw (9/19) Aug 20 2010 Because you are dealing with literals here, it's best to assume the comp...
- Jay Byrd (9/35) Sep 06 2010 And the relevance of that to the OP's post which noted that
Hi, The following code compiles and outputs "1 = 1" as expected: 1 == 1 && writeln("1 = 1"); However, the following code fails to compile (although it should not): 1 == 2 && writeln("1 = 2"); The error is as follows: Error: integral constant must be scalar type, not void What I expect that the second code should also compile and output nothing when executed. Am I missing something? Thanks.
Aug 20 2010
I forgot to mention that I am using dmd 2.048 on Ubuntu 10.04 64-bit.
Aug 20 2010
On 20/08/2010 20:59, Ersin Er wrote:Hi, The following code compiles and outputs "1 = 1" as expected: 1 == 1&& writeln("1 = 1"); However, the following code fails to compile (although it should not): 1 == 2&& writeln("1 = 2"); The error is as follows: Error: integral constant must be scalar type, not void What I expect that the second code should also compile and output nothing when executed. Am I missing something? Thanks.The return type of writeln is void. You can't && with void. You are asking 'is X true AND <something which can't return true or false> is true' which is clearly nonesense. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk
Aug 20 2010
On Friday, August 20, 2010 13:06:11 div0 wrote:On 20/08/2010 20:59, Ersin Er wrote:It's legal according to TDPL. It seems to be intended to be used as a shorthand for if. So, stuff like condition && writeln("my output"); are supposed to be perfectly legal as bizarre as that may seem. I don't believe that it would be legal to do if(condition && writeln("my output")) { } since the result fed to if must be a bool, but a statement doesn't need to result in bool, so apparently you can use && with a void function in a statement. It's just that the void function must be last. - Jonathan M DavisHi, The following code compiles and outputs "1 = 1" as expected: 1 == 1&& writeln("1 = 1"); However, the following code fails to compile (although it should not): 1 == 2&& writeln("1 = 2"); The error is as follows: Error: integral constant must be scalar type, not void What I expect that the second code should also compile and output nothing when executed. Am I missing something? Thanks.The return type of writeln is void. You can't && with void. You are asking 'is X true AND <something which can't return true or false> is true' which is clearly nonesense.
Aug 20 2010
On 20/08/2010 21:16, Jonathan M Davis wrote:It's legal according to TDPL. It seems to be intended to be used as a shorthand for if. So, stuff like condition&& writeln("my output"); are supposed to be perfectly legal as bizarre as that may seem. I don't believe that it would be legal to do if(condition&& writeln("my output")) { } since the result fed to if must be a bool, but a statement doesn't need to result in bool, so apparently you can use&& with a void function in a statement. It's just that the void function must be last. - Jonathan M DavisThen Andrei has taken leave of his senses and this is one situation where DMD is corrent and TDPL is wrong. Half arsed, moronic shortcuts like that belong in scripting languages and shell environements, not serious programming languages. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk
Aug 20 2010
On Friday, August 20, 2010 14:00:22 div0 wrote:Then Andrei has taken leave of his senses and this is one situation where DMD is corrent and TDPL is wrong. Half arsed, moronic shortcuts like that belong in scripting languages and shell environements, not serious programming languages.Well, Andrei is definitely a fan of using D for small scripts, so arguments that something shouldn't be done because it's intended for scripting aren't going to fly with him. Personally, I find it a bit weird, but I don't really care. I probably won't code that way, but I don't mind that it's an option. As for working in dmd, it _does_ work in dmd. Take this program for instance: import std.stdio; import std.array; void main(string[] args) { args.length > 1 && writeln("The program was called with arguments."); } It compiles just fine. If you don't pass any arguments to the program, then it prints nothing. If you do, then it prints The program was called with arguments. So, it looks to me like it generally works as intended. The fact that the case that started this thread doesn't work is a bug (quite possibly related to the fact that the condition can be determined at compile time). - Jonathan M Davis
Aug 20 2010
Jonathan M Davis:Well, Andrei is definitely a fan of using D for small scripts, so arguments that something shouldn't be done because it's intended for scripting aren't going to fly with him. Personally, I find it a bit weird, but I don't really care. I probably won't code that way, but I don't mind that it's an option.Even small scripts need to be tidy. And I don't like that stupid shortcut in a language that tries to be safe as D. Andrei is wrong here. A problem with similar shortcuts is that they save you few chars and they look handy, but sometimes they later come back to bite your ass. Perl is a good example of this. Bye, bearophile
Aug 20 2010
On Friday, August 20, 2010 15:32:16 bearophile wrote:Jonathan M Davis:It's essentially the same as putting an entire if statement on one line, which I'm not a fan of doing, but there are plenty of people who do. - Jonathan M DavisWell, Andrei is definitely a fan of using D for small scripts, so arguments that something shouldn't be done because it's intended for scripting aren't going to fly with him. Personally, I find it a bit weird, but I don't really care. I probably won't code that way, but I don't mind that it's an option.Even small scripts need to be tidy. And I don't like that stupid shortcut in a language that tries to be safe as D. Andrei is wrong here. A problem with similar shortcuts is that they save you few chars and they look handy, but sometimes they later come back to bite your ass. Perl is a good example of this. Bye, bearophile
Aug 20 2010
On Sat, Aug 21, 2010 at 00:00, div0 <div0 sourceforge.net> wrote:On 20/08/2010 21:16, Jonathan M Davis wrote: It's legal according to TDPL. It seems to be intended to be used as aIf Andrei is wrond and DMD is right, then the first example should not have compiled too..shorthand for if. So, stuff like condition&& writeln("my output"); are supposed to be perfectly legal as bizarre as that may seem. I don't believe that it would be legal to do if(condition&& writeln("my output")) { } since the result fed to if must be a bool, but a statement doesn't need to result in bool, so apparently you can use&& with a void function in a statement. It's just that the void function must be last. - Jonathan M DavisThen Andrei has taken leave of his senses and this is one situation where DMD is corrent and TDPL is wrong. Half arsed, moronic shortcuts like that belong in scripting languages and shell environements, not serious programming languages.-- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk-- Ersin Er http://metasolid.com
Aug 20 2010
On Fri, Aug 20, 2010 at 23:06, div0 <div0 sourceforge.net> wrote:On 20/08/2010 20:59, Ersin Er wrote:Then the first code should not compile too. By the way here is what Andrei wrote in his latest book for the expression a&&b: """ * If the type of b is not void, then the expression has type bool. If a is nonzero, the expression evaluates b and yields true if and only if b is nonzero. Otherwise, the expression evaluates to false. * If b has type void, the expression has type void as well. If a is nonzero, b is evaluated. Otherwise, b is not evaluated. Using && with a void expression on the right-hand side is useful as shorthand for an if statement: string line; ... """ So I expect my code to compile as well.Hi, The following code compiles and outputs "1 = 1" as expected: 1 == 1&& writeln("1 = 1"); However, the following code fails to compile (although it should not): 1 == 2&& writeln("1 = 2"); The error is as follows: Error: integral constant must be scalar type, not void What I expect that the second code should also compile and output nothing when executed. Am I missing something? Thanks.The return type of writeln is void. You can't && with void. You are asking 'is X true AND <something which can't return true or false> is true' which is clearly nonesense.-- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk-- Ersin ER http://metasolid.com
Aug 20 2010
== Quote from Ersin Er (ersin.er gmail.com)'s articleHi, The following code compiles and outputs "1 = 1" as expected: 1 == 1 && writeln("1 = 1"); However, the following code fails to compile (although it should not): 1 == 2 && writeln("1 = 2"); The error is as follows: Error: integral constant must be scalar type, not void What I expect that the second code should also compile and output nothing whenexecuted.Am I missing something? Thanks.Because you are dealing with literals here, it's best to assume the compiler will try to evaluate and compile down the code you write. The first example you give will be optimized down to just writeln("1 = 1"); Whilst your second example is simply false; Regards
Aug 20 2010
On Fri, 20 Aug 2010 20:33:43 +0000, Iain Buclaw wrote:== Quote from Ersin Er (ersin.er gmail.com)'s articleAnd the relevance of that to the OP's post which noted that 1 == 2 && writeln("1 = 2"); produces an error message complaining about void where a scalar is expected is what? Also irrelevant are statements that Andrei is wrong or even has taken leave of his senses merely for accurately describing in his book a particular bit of D's semantics that he may or may not have had any role in crafting.Hi, The following code compiles and outputs "1 = 1" as expected: 1 == 1 && writeln("1 = 1"); However, the following code fails to compile (although it should not): 1 == 2 && writeln("1 = 2"); The error is as follows: Error: integral constant must be scalar type, not void What I expect that the second code should also compile and output nothing whenexecuted.Am I missing something? Thanks.Because you are dealing with literals here, it's best to assume the compiler will try to evaluate and compile down the code you write. The first example you give will be optimized down to just writeln("1 = 1"); Whilst your second example is simply false; Regards
Sep 06 2010