Jump to page: 1 2
Thread overview
with (auto p = new ...)
Sep 23, 2014
Andre
Sep 23, 2014
Nordlöw
Sep 23, 2014
Graham Fawcett
Sep 23, 2014
Graham Fawcett
Sep 23, 2014
andre
Sep 23, 2014
Meta
Sep 24, 2014
Nordlöw
Sep 24, 2014
Andre
Sep 24, 2014
ketmar
Sep 26, 2014
Freddy
Sep 26, 2014
Freddy
September 23, 2014
Hi,

I just wonder why "with (auto p = new ...)" is not working.
It would be some syntax sugar in this scenario:

	with (auto p = new Panel())
	{
		parent = this;
		text = "bla";
		with (auto b = new Button())
		{
			parent = p; // Here p is needed
			text = "bla2";
		}
	}

source\app.d(8): Error: expression expected, not 'auto'
source\app.d(8): Error: found 'p' when expecting ')'
source\app.d(8): Error: found '=' instead of statement
...

Kind regards
André
September 23, 2014
On Tuesday, 23 September 2014 at 15:19:59 UTC, Andre wrote:
> I just wonder why "with (auto p = new ...)" is not working.
> It would be some syntax sugar in this scenario:

I presume with is limited to expressions and not statements as the messages says.

However, you can use

 	if (auto p = new Panel())

instead as long as the new doesn't fail, that is you still have memory left :)
September 23, 2014
How about:

    auto b - new Button(); with (b) {

On Tuesday, 23 September 2014 at 15:19:59 UTC, Andre wrote:
> Hi,
>
> I just wonder why "with (auto p = new ...)" is not working.
> It would be some syntax sugar in this scenario:
>
> 	with (auto p = new Panel())
> 	{
> 		parent = this;
> 		text = "bla";
> 		with (auto b = new Button())
> 		{
> 			parent = p; // Here p is needed
> 			text = "bla2";
> 		}
> 	}
>
> source\app.d(8): Error: expression expected, not 'auto'
> source\app.d(8): Error: found 'p' when expecting ')'
> source\app.d(8): Error: found '=' instead of statement
> ...
>
> Kind regards
> André

September 23, 2014
Sorry, I sent that last message before I intended to.

How about:

     auto b = new Button(); with (b) {
       ...
     }

'b' is explicitly outside of the scope of the 'with' block, which may not be what you intended. But you could use more braces to add an extra level of scope if that's an issue:

    ...
    text = "blah";
    {
       auto b = new Button(); with (b) {
           ...
       }
    }
    // b is no longer in scope

Graham



> On Tuesday, 23 September 2014 at 15:19:59 UTC, Andre wrote:
>> Hi,
>>
>> I just wonder why "with (auto p = new ...)" is not working.
>> It would be some syntax sugar in this scenario:
>>
>> 	with (auto p = new Panel())
>> 	{
>> 		parent = this;
>> 		text = "bla";
>> 		with (auto b = new Button())
>> 		{
>> 			parent = p; // Here p is needed
>> 			text = "bla2";
>> 		}
>> 	}
>>
>> source\app.d(8): Error: expression expected, not 'auto'
>> source\app.d(8): Error: found 'p' when expecting ')'
>> source\app.d(8): Error: found '=' instead of statement
>> ...
>>
>> Kind regards
>> André

September 23, 2014
Yes, that is also working. As far as I remember (only my tablet currently available) also this works:

Panel p;
with(p = new Panel ()) {}

Therefore it seems strange,the same does not work with auto.

Kind regards
André


On Tuesday, 23 September 2014 at 19:49:22 UTC, Graham Fawcett wrote:
> Sorry, I sent that last message before I intended to.
>
> How about:
>
>      auto b = new Button(); with (b) {
>        ...
>      }
>
> 'b' is explicitly outside of the scope of the 'with' block, which may not be what you intended. But you could use more braces to add an extra level of scope if that's an issue:
>
>     ...
>     text = "blah";
>     {
>        auto b = new Button(); with (b) {
>            ...
>        }
>     }
>     // b is no longer in scope
>
> Graham
>
>
>
>> On Tuesday, 23 September 2014 at 15:19:59 UTC, Andre wrote:
>>> Hi,
>>>
>>> I just wonder why "with (auto p = new ...)" is not working.
>>> It would be some syntax sugar in this scenario:
>>>
>>> 	with (auto p = new Panel())
>>> 	{
>>> 		parent = this;
>>> 		text = "bla";
>>> 		with (auto b = new Button())
>>> 		{
>>> 			parent = p; // Here p is needed
>>> 			text = "bla2";
>>> 		}
>>> 	}
>>>
>>> source\app.d(8): Error: expression expected, not 'auto'
>>> source\app.d(8): Error: found 'p' when expecting ')'
>>> source\app.d(8): Error: found '=' instead of statement
>>> ...
>>>
>>> Kind regards
>>> André

September 23, 2014
I think this is just a language oversight. It's allowed in if statements, and people have made a good case for allowing it for switch statements. It just hasn't been implemented. I made an attempt one evening to implement it for switch statements,  but I'm not at all familiar with DMD, so I put it on the back burner for the time being.
September 24, 2014
On Tuesday, 23 September 2014 at 20:16:29 UTC, andre wrote:
> Therefore it seems strange,the same does not work with auto.

Yes, it seem logical to me allow this also in with and switch.
September 24, 2014
Enhancement 13526 filed:
https://issues.dlang.org/show_bug.cgi?id=13526

September 24, 2014
On Wed, 24 Sep 2014 14:39:25 +0000
Andre via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote:

> Enhancement 13526 filed: https://issues.dlang.org/show_bug.cgi?id=13526
i wrote a quickhack-patch for this ER. as it's my first patch that goes outside parser it needs to be reviewed by someone who knows compiler internals.

ah, and we need grammar fixes for it too, but it's completely out of my scope now.


September 26, 2014
On Tuesday, 23 September 2014 at 15:19:59 UTC, Andre wrote:
> Hi,
>
> I just wonder why "with (auto p = new ...)" is not working.
> It would be some syntax sugar in this scenario:
>
> 	with (auto p = new Panel())
> 	{
> 		parent = this;
> 		text = "bla";
> 		with (auto b = new Button())
> 		{
> 			parent = p; // Here p is needed
> 			text = "bla2";
> 		}
> 	}
>
> source\app.d(8): Error: expression expected, not 'auto'
> source\app.d(8): Error: found 'p' when expecting ')'
> source\app.d(8): Error: found '=' instead of statement
> ...
>
> Kind regards
> André
have you tried this?
---
import std.stdio;

struct myStruct{
	int c=299792458;
}

void main(){
	with(new myStruct()){
		writeln(c);
	}
}
---
« First   ‹ Prev
1 2