Jump to page: 1 2
Thread overview
Problem with using && as shorthand for if
Aug 20, 2010
Ersin Er
Aug 20, 2010
Ersin Er
Aug 20, 2010
div0
Aug 20, 2010
Jonathan M Davis
Aug 20, 2010
div0
Aug 20, 2010
Jonathan M Davis
Aug 20, 2010
bearophile
Aug 20, 2010
Jonathan M Davis
Aug 20, 2010
Ersin Er
Aug 20, 2010
Ersin Er
Aug 20, 2010
Iain Buclaw
Sep 07, 2010
Jay Byrd
August 20, 2010
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
I forgot to mention that I am using dmd 2.048 on Ubuntu 10.04 64-bit.
August 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
August 20, 2010
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
== 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
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
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
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
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
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
« First   ‹ Prev
1 2