<div dir="ltr"><div>Ah, yes, set-&gt;stream isn&#39;t primitive because it can be derived if you have set-first and either set-rest or set-remove.  And I know there are dependency cycles, this is intentional so that you can implement any one of several related things, but most of them were supposed to go all the way down to primitive methods (in some sense) if all else failed.<br>

<br></div>Would it be better to just remove the &quot;primitve&quot; / &quot;derived&quot; distinction, since it&#39;s somewhat artificial, and leave it up to the individual method descriptions?  Is there some better way I should be describing things?<br>

</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:51 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">

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