Compile-time Interfaces

Jacob Carlborg doob at me.com
Sun Nov 27 03:36:10 PST 2011


On 2011-11-27 02:03, 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

"auto" cannot be used here. Just like it can't be used in any place 
where there is no implementation of a function.

Seems to me it needs to look something like this:

enum interface Range (T)
{
   void popFront();
   @property bool empty() const;
   @property T front();
}

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list