What Does Haskell Have to Do with C++?

Christopher Wright dhasenan at gmail.com
Thu Oct 29 04:27:51 PDT 2009


Don wrote:
> Andrei Alexandrescu wrote:
>> Don wrote:
>>> Jeremie Pelletier wrote:
>>>> http://bartoszmilewski.wordpress.com/2009/10/21/what-does-haskell-have-to-do-with-c/ 
>>>>
>>>>
>>>> Bartosz's second part of 'Template Metaprogramming Made Easy 
>>>> (Huh?)', its quite a read :)
>>>
>>> Yes, it is excellent. Two comments:
>>> (1) Bartosz's D examples make me seriously question 'static foreach' 
>>> which is scheduled for implementation (bugzilla 3377).
>>> If implemented, it will be a source of frustration, since it will not 
>>> be very usable inside templates. The ability to exit from a 'static 
>>> foreach' is something which is possible with a 'return'-style syntax, 
>>> but is not possible with the 'eponymous template hack'.
>>
>> I think breaking early out of a static foreach is not necessary (but 
>> indeed convenient) for writing good loops.
>>
>>> (2) It seems pretty clear that we need to allow the eponymous trick 
>>> to continue to work when more than one template member is present. I 
>>> think everyone who's ever attempted template metaprogramming in D has 
>>> proposed  it!
>>
>> Yes, that was on the list for a long time. Bartosz even has 
>> participated to many related discussions. I'm surprised the article 
>> made it seem an unescapable matter of principles, when it clearly is a 
>> trivially fixable bug in the language definition.
> 
> Yes, looking at the compiler source, it doesn't look too difficult.  The 
> fact that something like this works:
> 
> template foo(int X)
> {
>    static if (bar!(X)) { const int foo = 57; }
>    else { const char [] foo = "abc"; }
> }
> makes it pretty clear that the difficult part has already been done.
> 
> I don't know what happens with template mixins, though. I hate template 
> mixins (and I'm not convinced they're useful for anything, either).

My mock object library <http://dsource.org/projects/dmocks/> uses:
mixin(method!("name", returnType, arguments...));

The implementation is a long and ugly string mixin.

There's a bug that prevents you from implementing interface methods with 
aliases. If this were removed, I could replace the long and ugly string 
mixin with a very short string mixin and a short template mixin.

Due to problems with .stringof, my current system usually fails for 
methods with templated arguments or return types (eg void 
filter(HashSet!(int) integers).

Now that I think of it, I could probably make things better by using a 
forwarding function.



More information about the Digitalmars-d mailing list