Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r54169 - sandbox/committee/LWG/proposals
From: dave_at_[hidden]
Date: 2009-06-21 23:02:26


Author: dave
Date: 2009-06-21 23:02:26 EDT (Sun, 21 Jun 2009)
New Revision: 54169
URL: http://svn.boost.org/trac/boost/changeset/54169

Log:
These are my suggested edits.

Text files modified:
   sandbox/committee/LWG/proposals/Intentional | 149 ++++++++++++++++-----------------------
   1 files changed, 62 insertions(+), 87 deletions(-)

Modified: sandbox/committee/LWG/proposals/Intentional Concept Mapping.html
==============================================================================
--- sandbox/committee/LWG/proposals/Intentional Concept Mapping.html (original)
+++ sandbox/committee/LWG/proposals/Intentional Concept Mapping.html 2009-06-21 23:02:26 EDT (Sun, 21 Jun 2009)
@@ -38,34 +38,32 @@
 
   <h2>Introduction</h2>
 
- <p>Uses of C++0x concept maps include:</p>
+ <p>A C++0x concept map can be useful (among other things) as:</p>
 
   <ul>
- <li>Declaring the intention that a class models a concept, expressed in
- code rather than in documentation.<br />
- &nbsp;</li>
+ <li>A declaration to the compiler of the intention that a class models a
+ concept, expressed in code rather than in documentation.</li>
 
- <li>Declaring to users and maintainers of the type that modeling the
+ <li>A declaration to users and maintainers of the type that modeling the
     concept is part of the type's public interface and not just happenstance;
     i.e. it is a property that can be counted on and must be preserved as the
     code evolves.</li>
- </ul>
 
- <p>As of CD1, this is expressed with concept maps that are often empty:</p>
+ <li>A tool for the interactive model development that causes the compiler
+ to prompt the author for all required structural elements.</li>
+ </ul>
 
- <blockquote>
- <pre>
+ <p>As of CD1, concept maps used for this purpose are often empty:</p>
+ <pre>
 class Endian
 {
   ...
 };
-</pre>
- <pre>
+
 concept_map std::Regular&lt;Endian&gt; {}
 concept_map std::StandardLayoutType&lt;Endian&gt; {}
 concept_map std::TrivialType&lt;Endian&gt; {}
 </pre>
- </blockquote>
 
   <p>Although this formulation is technically sufficient and will ensure the
   type models the concepts, it has some problems:</p>
@@ -73,99 +71,88 @@
   <ul>
     <li>The location of the concept maps after the class definition subverts
     self-documentation, particularly for large classes, negating some of the
- value as documentation to users and maintainers.<br />
- &nbsp;</li>
+ value as documentation to users and maintainers.</li>
 
- <li>Specifying the concept maps after the class definition tends to push
- this important activity until later in the development cycle,&nbsp; yet
- from a design and testing standpoint it best occurs early on in the
- development cycle.<br />
- &nbsp;</li>
+ <li>The location of the concept maps after the class definition tends to
+ tends to push the important activity of constraining the class until
+ later in the class' development cycle, but it best occurs early (probably
+ first).</li>
 
- <li>The empty concept maps are excessively verbose.</li>
+ <li>Empty concept maps are excessively verbose.</li>
   </ul>
 
- <p>This paper proposes that the above could also be written as:</p>
-
- <blockquote>
- <pre>
+ <p>This paper proposes that the above code could also be written as:</p>
+ <pre>
 class Endian -&gt; std::Regular, std::StandardLayoutType, std::TrivialType
 {
   ...
 };
 </pre>
- </blockquote>
 
   <h2>Syntax</h2>
 
   <p>The proposed wording uses <code>-&gt;</code> as a syntax marker for the
   beginning of the list of concepts to be mapped. The authors are not wedded
- to <code>-&gt;</code> , and considered several alternate keyword and
+ to <code>-&gt;</code>, and considered several alternate keyword and
   punctuation possibilities.</p>
 
- <p>The first keyword considered was <code>requires</code>, but it was
- rejected because when you write:</p>
-
- <blockquote>
- <pre>
+ <p>We did consider using <code>requires</code>, but it was rejected on the
+ grounds that it would make a <code>concept_map</code> look too much like a
+ requires clause in a region of code where either could appear, but a
+ <code>concept_map</code> is fundamentally different from a
+ <code>requires</code> clause. When you write:</p>
+ <pre>
 template &lt;typename X&gt;
   requires&lt;EqualityComparable&lt;X&gt; &gt;
 class Y
 {
    ...
 };
-</pre>
- </blockquote>
-
- <p>you're just constraining X, nothing more. &nbsp;It's pure requirement
- checking. &nbsp;When you write:</p>
-
- <blockquote>
- <pre>
+</pre>you're just constraining X, nothing more. &nbsp;It's pure requirement
+checking. &nbsp;However, when you write:
+ <pre>
 template &lt;typename X&gt;
 class Y -&gt; EqualityComparable
 {
    ...
 };
-</pre>
- </blockquote>
-
- <p>you're generating a concept map for all specializations of Y, with all
- that that implies (e.g. generation of defaults, Y&lt;T&gt; can be used
- where EqualityComparable is required, etc):</p>
-
- <blockquote>
- <pre>
-// implied by the above
+</pre>you're generating a concept map for all specializations of
+<code>Y</code>, with all that that implies (e.g. generation of defaults,
+Y&lt;T&gt; can be used where EqualityComparable is required, etc):
+ <pre>
+// generated by the above
 template &lt;typename T&gt;
 concept_map EqualityComparable&lt;Y&lt;T&gt; &gt; { };
 </pre>
- </blockquote>
-
- <p>A concept_map is fundamentally different from a requires clause in other
- ways, too: the former can only occur in unconstrained contexts while the
- latter can only occur in constrained ones.</p>
 
   <p>We welcome syntax suggestions from the committee.</p>
 
   <h2>Motivation</h2>
 
   <p>The critical motivation for this proposal is the desire to be able to
- say "my type models concepts XXX, YYY, and ZZZ, and is broken if it doesn't
- do that", and do that in such a way that users and maintainers understand
- that this is part of my&nbsp; type's public interface and not just
- happenstance.</p>
-
- <p>This proposal is not replacement for concept maps; we view concept maps
- - even empty ones - as meeting critical needs. We wish to make empty
- concept maps more convenient and less verbose, not replace them
- entirely..</p>
-
- <p>The motivating problem of not being able to say what we mean in the
- obvious place is not solved by making more concepts <code>auto</code> or
- making <code>auto</code> the default. Those are important issues, but are
- orthogonal to the intentional concept mapping concerns of this
- proposal.</p>
+ say "my type models concepts XXX, YYY, and ZZZ, and please tell me if I get
+ it wrong (structurally)", and to do that in such a way that users and
+ maintainers understand that this is part of my&nbsp; type's public
+ interface and not just happenstance.</p>
+
+ <p>This proposal is not replacement for concept maps; we view
+ concept maps&#8212;even empty ones&#8212;as meeting critical
+ needs. We wish to make empty concept maps more convenient, more
+ expressive, and less verbose in the common case where one is
+ intentionally creating a model of a known concept, however empty
+ <code>concept_map</code>s will still be needed for post-hoc
+ adaptation of types to concepts, an important function
+ of <code>concept_map</code>s in general.</p>
+<!--
+ <p>The underlying problem of not being able to say what we mean
+ concisely&#8212;and in the obvious place&#8212;is not solved by
+ making more concepts <code>auto</code> or making <code>auto</code>
+ the default. Those are important issues, but are orthogonal to the
+ intentional concept mapping concerns of this proposal.</p>
+-->
+ <!-- Beman, I'm not sure I want to bring that argument up; are you?
+ It seems a bit like inviting trouble, and I'd like to save trouble
+ for my other paper ;-) -->
 
   <h2>Proposed Wording</h2>
 
@@ -233,26 +220,21 @@
       nested-name-specifier<sub>opt</sub> concept-name</i></p>
     </blockquote>
 
- <p>A <i>concepts-clause</i> contains a list of concepts to map to. A
- concept is mapped to for each <i>mapped-concept</i> as if by a
+ <p>A <i>mapped-concept-clause</i> contains a list of concepts to map to.
+ A concept is "mapped to" for each <i>mapped-concept</i> as if by a
     <code>concept_map</code>([concept.map]). The <code>concept_map</code>
     acts as if appears immediately after the class being defined, and is
     equivalent to:</p>
-
- <blockquote>
- <pre>
+ <pre>
 concept_map <i>Concept</i>&lt;<i>Class</i>&gt; {};
 </pre>
- </blockquote>
 
     <p>where <i><code>Concept</code></i> is the <i>mapped-concept</i>, and
     <i><code>Class</code></i> is the class where the
     <i>mapped-concept-clause</i> appears.</p>
 
     <p><i>[Example:</i></p>
-
- <blockquote>
- <pre>
+ <pre>
 template &lt;typename X&gt;
   class Y -&gt; EqualityComparable
   {
@@ -260,15 +242,11 @@
   };
 </pre>
 
- <p>Generates a concept map for all specializations of Y, with all that
- that implies (e.g. generation of defaults, Y&lt;T&gt; can be used where
- EqualityComparable is required, etc):</p>
- <pre>
-// implied by the above
+ <p>The above implicitly generates the following concept map:</p>
+ <pre>
 template &lt;typename T&gt;
   concept_map EqualityComparable&lt; Y&lt;T&gt; &gt; {};
 </pre>
- </blockquote>
 
     <p><i>--end example]</i></p>
   </blockquote>
@@ -279,8 +257,5 @@
   this proposal, often with syntax using the <code>requires</code> keyword.
   Jerry Schwarz, in committee message c++std-lib-23459, suggested syntax that
   mimics inheritance.</p>
- <hr />
-
- <p>&nbsp;</p>
 </body>
 </html>


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk