Compile-time Interfaces

Timon Gehr timon.gehr at gmx.ch
Sat Nov 26 17:13:40 PST 2011


On 11/27/2011 02:03 AM, Andrei Alexandrescu wrote:
> On 11/26/11 6:40 PM, Kapps wrote:
>> One of the great things about D is the ability to do so much work at
>> compile-time, including static verification. An example is the amount of
>> constraints available for templates, static ifs, etc. But at some point,
>> it starts getting very problematic to just figure out what something
>> does, and what something can do. An example for this, is ranges. They
>> can be very confusing, and you don't know what they can do without
>> actually going and looking up the exact definition of them. Even then,
>> you have to know that the templated type a function expects is a range.
>> Again, very confusing, and arguably messy. Finally, even now that you
>> know what methods you can call on this mysterious type T, and you see
>> that there's a clause isInputRange!(T) on the method, your IDE still has
>> no clue about any of these things making it impossible to have
>> semi-decent code completion for that type.
>>
>> Which brings in, compile-time interfaces. It seems like a natural thing
>> to include when you have the above tools. Instead of having a method
>> such as:
>> auto DoSomething(T)(T Data) if(isInputRange!(T)) { }
>> You could simply do:
>> auto DoSomething(Range Data) { }
>> where Range is defined as:
>> enum interface Range {
>> void popFront() const;
>> @property bool empty() const;
>> @property auto front();
>> }
>
> What's "auto" here? This thing alone pretty much destroys the idea;
> we've considered it very seriously.
>
> Andrei
>

I would solve that similar to this:

enum interface Range {
   private alias T; // could also use 'static' instead of 'private' :o)
   void popFront();
   @property bool empty() const;
   @property T front();
}

Where "T" does not actually contribute to the imposed interface.





More information about the Digitalmars-d mailing list