On Saturday, 27 October 2012 at 11:41:07 UTC, bearophile wrote:
Peter Alexander:

void foo(ForwardRange Range)(Range r)
{
   r.popBack();
}

And *immediately* get a type error without having to instantiate it with a variety of different range types.

It's not an easy problem. To solve it the Rust language uses typeclasses adapted from Haskell. But unlike the usual Haskell compilers Rust doesn't use global type inferencing and it keeps the C++-style monomorphization, so at run-time its generic programming is as efficient as C++ generic programming.

Yeah, it's certainly not going to be easy. It's unfortunate that D adopted the whole C++ style "glorified macros" approach to templates -- it makes it very difficult to reason about (or automate reasoning about) the semantics of your code.

Retrofitting some sort of structure to templates will be a Herculean task, but I think it has to happen. It is clear to me that the development process we use now (write the template, try a few instantiations, pray) is unsustainable beyond simple templates.


Reply via email to