<div dir="ltr"><div>Hmm.  Well, partially, I wasn&#39;t sure how to document the methods, because the relationships are complex, and because we don&#39;t have existing terminology or documentation patterns for this.  I&#39;m open to other suggestions, and especially (though not exclusively) to patches.  For the other part, I either should have made it as you say -- implement the &quot;primitive&quot; ones and you get the others -- or else I should have clearly documented the relationship somewhere.  I can&#39;t remember, now, if I thought I had made the primitive ones sufficient, or if I knew there were others you needed to implement, or if I just forgot to think that whole thing through.<br>

<br>Do you have examples of which ones don&#39;t come &quot;for free&quot; with the primitive methods?<br></div></div><div class="gmail_extra"><br clear="all"><div>Carl Eastlund</div>
<br><br><div class="gmail_quote">On Thu, Aug 1, 2013 at 6:27 PM, Stephen Chang <span dir="ltr">&lt;<a href="mailto:stchang@ccs.neu.edu" target="_blank">stchang@ccs.neu.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Just played a bit with gen:set. It looks great and in particular the<br>
fallback implementations are very convenient.<br>
<br>
One comment: the distinction between &quot;primitive&quot; methods and &quot;derived&quot;<br>
methods confused me somewhat. Can you explain the reasoning for<br>
determining which is which?<br>
<br>
For example, when I first read the docs, I thought that if I<br>
implemented the primitives, I would get the derived, but that&#39;s not<br>
the case since some of the derived methods depend on each other.<br>
Reading the docs more thoroughly, it sort of seems like there&#39;s an<br>
implicit separation along the lines of iterability, ie, derived sets<br>
are &quot;iterable&quot; since many of the derived methods require set-&gt;stream,<br>
but that&#39;s not exactly right either.<br>
<div><div class="h5"><br>
<br>
On Thu, Jul 25, 2013 at 1:58 PM, Carl Eastlund &lt;<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>&gt; wrote:<br>
&gt; After some fixes, mostly to contracts and documentation, I&#39;ve pushed the new<br>
&gt; generics and set features to the master branch.<br>
&gt;<br>
&gt; Carl Eastlund<br>
&gt;<br>
&gt;<br>
&gt; On Tue, Jul 23, 2013 at 11:37 AM, Carl Eastlund &lt;<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; My work on adding gen:set, and related changes to define-generics and<br>
&gt;&gt; gen:dict, is ready for review and (hopefully) to push to the master branch.<br>
&gt;&gt; The branch moved in the process of cleaning things up, it&#39;s now at:<br>
&gt;&gt;<br>
&gt;&gt;   <a href="https://github.com/carl-eastlund/racket/tree/generics-from-scratch" target="_blank">https://github.com/carl-eastlund/racket/tree/generics-from-scratch</a><br>
&gt;&gt;<br>
&gt;&gt; (The &quot;from scratch&quot; just refers to the process of rebuilding the git<br>
&gt;&gt; history, I didn&#39;t go out of my way to rewrite anything in the code base from<br>
&gt;&gt; scratch, although in some places a lot of code did move around.)<br>
&gt;&gt;<br>
&gt;&gt; What&#39;s new in the branch:<br>
&gt;&gt;<br>
&gt;&gt; - Generics now support a few new options<br>
&gt;&gt;   - #:fallbacks specifies fallback method implementations for instances<br>
&gt;&gt; with no implementation<br>
&gt;&gt;   - #:fast-defaults specifies instances on a &quot;fast path&quot;, useful for<br>
&gt;&gt; built-in types<br>
&gt;&gt;   - #:defined-predicate gives a more intuitive and efficient interface<br>
&gt;&gt; than #:defined-table<br>
&gt;&gt;   - #:derive-property allows generics to piggy-back on existing struct<br>
&gt;&gt; properties<br>
&gt;&gt;<br>
&gt;&gt; - Sets are now a generic datatype through gen:set<br>
&gt;&gt;   - lists are now sets<br>
&gt;&gt;   - the built-in set types are now documented as &quot;hash sets&quot;<br>
&gt;&gt;   - there are mutable and weak hash sets<br>
&gt;&gt;   - you can define new set types quickly with define-custom-set-types<br>
&gt;&gt;   - most set operations are now methods with fallbacks<br>
&gt;&gt;   - sets now support -copy and -clear operations, plus mutating [!]<br>
&gt;&gt; versions of operations<br>
&gt;&gt;<br>
&gt;&gt; - Dictionaries have a few changes<br>
&gt;&gt;   - new macro define-custom-hash-types [*]<br>
&gt;&gt;   - most dict operations are now methods with fallbacks<br>
&gt;&gt;   - dicts now support -copy, -clear, -clear!, and -empty? operations<br>
&gt;&gt;<br>
&gt;&gt; I&#39;ve run some benchmarks and performance of the various generic operations<br>
&gt;&gt; are comparable to the current HEAD, so there should be no major performance<br>
&gt;&gt; changes with this patch.<br>
&gt;&gt;<br>
&gt;&gt; [*] I&#39;ve added define-custom-hash-types and define-custom-set-types rather<br>
&gt;&gt; than just adding make-custom-set akin to make-custom-hash because<br>
&gt;&gt; make-custom-hash is hard to use.  The documented behavior -- that any custom<br>
&gt;&gt; hash is equal to any other created with the same bindings and predicates /<br>
&gt;&gt; hash functions -- was never true and can be expensive or at least tricky to<br>
&gt;&gt; implement.  It seemed more sensible to just remove the erroneous<br>
&gt;&gt; documentation on make-custom-hash, and add the definition form to create<br>
&gt;&gt; constructors for new, explicitly-compatible dict and set types.  Both<br>
&gt;&gt; definition forms bind predicates and constructors for new (set or dict)<br>
&gt;&gt; types with immutable, mutable, and weak variants that inter-operate.<br>
&gt;&gt;<br>
&gt;&gt; If there are no serious issues brought up in the next day or two, I&#39;ll<br>
&gt;&gt; push it to the development branch, since our current release process isn&#39;t<br>
&gt;&gt; following HEAD.<br>
&gt;&gt;<br>
&gt;&gt; Carl Eastlund<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _________________________<br>
&gt;   Racket Developers list:<br>
&gt;   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
&gt;<br>
<br>
</blockquote></div><br></div>