News for hackers. Stuff that matters.
Re:Concepts: The Future of Generic Programming [pdf] by steveklabnik on Tuesday December 20, 2016 @09:02PM (#13226228)
Warning: // 1990s style generic code: from the article describes me and C++, though I do understand more modern C++ at a basic level, I'm not an expert. You might say I'm.... rusty...

ahem.

One huge difference in general between C++ templates and Rust's generics (I _believe_ Java/C# are more like Rust here, and I'm not sure about Swift) in that C++ templates generally don't check that their calling code actually supports the type that's passed into the template. In other words, the check happens after the template is expanded. (This is the sort example on page 3). Rust's generics system does the opposite: it requires that if you call a method on some generic parameter, that generic parameter is constrained by a trait that has that method. This happens before expansion. So concepts are, in some ways, an attempt to make the C++ system closer to Rust's system. (This is ignoring the actual chronology here, of course: concepts have been in development a long time).

The way "requires" works here is very different than in Rust, as well. In Rust, you define a trait the same way you'd define regular methods. If those methods have a body, then it's used as a default implementation, if it does not, then you must implement that method. The equivalent of "must have an iterator type" is associated types, you add "type Name;" instead of a method signature.

So the equivalent of the "Sequence" type on page 7 would be

  trait Sequence {
      type Value;
      type Iterator<Item=Value>; // Iterator itself has an associated type, Value
    
      fn begin() -> Self::Iterator;
      fn end() -> Self::Iterator;
  }
roughly speaking. I don't think this exactly works, but just to give you some idea of how the syntaxes roughly compare. In general, I know that a Sequence trait in Rust would require higher kinded types or associated type constructors, which Rust does not yet have, and so the concept is probably not directly expressible.

That's my impressions after reading this. I have been meaning to read about concepts for a while, but since I only have so much time, have mostly waited to see how they shake out before really digging in. It's slightly slower going since my C++ isn't spectacular. This post mostly represents my understanding of the differences, I'm not trying to make any judgements here, etc.

Re:Concepts: The Future of Generic Programming [pdf] by lobster_johnson on Wednesday December 21, 2016 @02:09AM (#13227351)
Can concepts be used like traits in non-generic code? Which is to say, can it be used as a type name of a variable or function argument? Because there seems to be a lot of overlap between a concept and a pure virtual class, both of which define function signatures. But if concepts are only for templates, and you still have to use pure virtual classes to express traits, that seems like a missed opportunity to me. But I may be missing some nuance here.
Re:Concepts: The Future of Generic Programming [pdf] by matt_d on Wednesday December 21, 2016 @11:28AM (#13230326)
> can it be used as a type name of a variable or function argument?

If I understand correctly, placeholders may work for this. This use is described in the "Programming with placeholders" section of the "Introducing concepts" article: https://accu.org/index.php/journals/2157

The remaining articles in Andrew Sutton's C++ concepts series are pretty good, too; so, just in case anyone is interested, here are the links:

- "Defining Concepts" - https://accu.org/index.php/journals/2198

- "Overloading with Concepts" - https://accu.org/index.php/journals/2316

Re:Concepts: The Future of Generic Programming [pdf] by lobster_johnson on Wednesday December 21, 2016 @01:17PM (#13231305)
If I understand the first article about placeholders correctly, concepts are indeed intended to be used where you can use ordinary types, just like traits. That looks really cool, if it ends up in the standard.
Re:Concepts: The Future of Generic Programming [pdf] by steveklabnik on Wednesday December 21, 2016 @09:32AM (#13229358)
It's not clear to me; I didn't see it in this pdf but might have missed it.