Thread overview | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
August 20, 2010 Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
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. |
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ersin Er | I forgot to mention that I am using dmd 2.048 on Ubuntu 10.04 64-bit. |
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ersin Er | 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 |
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to div0 | On Friday, August 20, 2010 13:06:11 div0 wrote:
> 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.
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 Davis
|
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ersin Er | == Quote from Ersin Er (ersin.er@gmail.com)'s article > 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. 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 |
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | 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 Davis 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. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk |
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to div0 | 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
|
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to div0 Attachments:
| On Fri, Aug 20, 2010 at 23:06, div0 <div0@sourceforge.net> wrote: > 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. 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; ... line == "#\n" && writeln("Got a # successfully"); """ So I expect my code to compile as well. > -- > My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk > -- Ersin ER http://metasolid.com |
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to div0 Attachments:
| 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 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 Davis >> > > 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. If Andrei is wrond and DMD is right, then the first example should not have compiled too.. > -- > My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk > -- Ersin Er http://metasolid.com |
August 20, 2010 Re: Problem with using && as shorthand for if | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | 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
|
Copyright © 1999-2021 by the D Language Foundation