Recursive aliases?

bcs bcs at example.com
Thu Apr 26 21:30:53 PDT 2012


On 04/23/2012 04:44 AM, Steven Schveighoffer wrote:
> On Sat, 21 Apr 2012 15:46:29 -0400, Mehrdad <wfunction at hotmail.com> wrote:
>
>> alias int delegate(out ItemGetter next) ItemGetter;
>>
>> We currently can't do the above^ in D, but what do people think about
>> allowing it?
>> i.e. More specifically, I think an alias expression should be able to
>> refer to the identifier (unless it doesn't make sense, like including
>> a struct inside itself).
>> (It would require a look-ahead.)
>
> It doesn't work.
>
> If I do this:
>
> alias int delegate() dtype;
>
> alias int delegate(dtype d) ddtype;
>
> pragma(msg, ddtype.stringof);
>
> I get:
>
> int delegate(int delegate() d)
>
> Note how it's not:
>
> int delegate(dtype d)
>
> Why? Because alias does not create a new type. It's a new symbol that
> *links* to the defined type.
>

The only problem is that the text representation of the type contains 
it's self as a proper sub-string. As far as the compiler is concerned, 
this should be no harder to handle than a linked list node or the 
curiously recurring template pattern.

Another use for it would be one of the cleaner state machine 
implementations I've ever seen:


alias foo delegate() foo;

foo = start();
while ((foo = foo())) {}




More information about the Digitalmars-d mailing list