Is it possible to handle 'magic' property assignments a'la PHP?

H. S. Teoh hsteoh at quickfur.ath.cx
Thu Jan 9 09:57:20 PST 2014


On Thu, Jan 09, 2014 at 09:49:17AM +0100, Jacob Carlborg wrote:
> On 2014-01-08 19:04, H. S. Teoh wrote:
[...]
> >In fact, we can already almost get the desired syntax in the current
> >language:
> >
> >	/* Current D already supports this: */
> >	range.my_foreach!((i,j) {
> >		/* body */
> >	});
> 
> Almost ;)
> 
> >which isn't that much different from the proposed syntactic sugar:
> >
> >	range.my_foreach(i,j) {
> >		/* body */
> >	}
> >
> >We're just saving on the '!', ';', and an extra pair of parentheses.
> 
> It quickly get clumsy when you need to pass regular arguments to the
> function:
> 
> void foo (alias dg) (int a, int b);
> 
> foo!((i, j) {
>     // body
> })(1, 2);
> 
> Not pretty.

True. So this should be one of the motivating use cases for our DIP.


> >I guess the only real advantage is that we get to imitate built-in
> >foreach syntax. E.g., if we use the form with arguments but no
> >indexing arguments, we can pretend to be an if-statement:
> >
> >	// (Whatever "dynamic if" means...)
> >	void dynamic_if(alias dg)(bool cond)
> >		if (is(typeof(dg())))
> >	{
> >		// Haha, we're just wrapping the built-in 'if' cuz we
> >		// can.
> >		if (cond) dg();
> >	}
> >
> >	int x;
> >	dynamic_if (x==0) {
> >		writeln("Boo yah!");
> >	}
> >
> >Or if we use the argumentless form to implement custom block constructs:
> 
> BTW, what do you think about not needing braces if the delegate body
> only contains a single statement, like with regular statements:
> 
> dynamic_if (x==0)
>     writeln("foo");
> 
> With the alias syntax, I'm wondering if the compiler will have any
> problem with that you can pass almost anything to an alias parameter
> and not just a delegate.
[...]

I'm afraid that this might become ambiguous, for example:

	int* gun(...) {...}

	func (x==0)
		*gun(y);

Does the second statement mean `func!(() => *gun(y))(x==0)`, or does it
mean `func(x==0) * gun(y)`? While it's not hard to disambiguate this
semantically, it means it's impossible to parse before you analyze it,
which is probably a bad idea.


T

-- 
Nobody is perfect.  I am Nobody. -- pepoluan, GKC forum


More information about the Digitalmars-d-learn mailing list