<p>Short(ish) answer until I get reliable internet in my new apartment -- gen:set is modeled after gen:dict.  I don't want us to have a new design for each interface.  Because methods are optional, we get by with one name for one or more related subinterfaces.  That's the principle by which I justified set-add and set-add! In one interface.</p>

<p>And if we separate them, we need one interface with just queries, then four more for add, remove, add!, and remove!, at the very least.  It's a messy direction to go in.</p>
<p>Carl Eastlund</p>
<p>--<br>
WARNING!  Poorly-typed cell phone email precedes.</p>
<div class="gmail_quote">On Oct 2, 2013 4:35 PM, "Jay McCarthy" <<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I agree. I think the important thing with generics is unlike mpair?<br>
the set? predicate only necessarily implies that the methods are<br>
available (which is the source of my original complaint). We need to<br>
design the meaning of predicates just like we design the interface. I<br>
think that if we want mset to be a set then set? cannot imply<br>
immutable? but since that is a valuable property, it is worth<br>
designing a predicate that gives it, if only as a human thing.<br>
<br>
Jay<br>
<br>
On Wed, Oct 2, 2013 at 2:29 PM, Robby Findler<br>
<<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>> wrote:<br>
> That sounds right.<br>
><br>
> But just in case there is any confusion on the larger point: predicates as<br>
> way we check properties to ensure good properties of our abstractions is one<br>
> of the important things that we have mostly gotten right in Racket.<br>
> Chaperones, separate pair? and mpair? predicates, and presumably lots of<br>
> other stuff are the way they are for this kind of reason.<br>
><br>
> Robby<br>
><br>
><br>
> On Wed, Oct 2, 2013 at 3:21 PM, Jay McCarthy <<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>> wrote:<br>
>><br>
>> Even if we were to remove set-add! from gen:set and not great gen:mset<br>
>> then that would not be a vaild property. Generics are a lower bound on<br>
>> the interface, not an upper bound, so there could be other functions<br>
>> on the data structure that implement mutation. For instance, a gen:set<br>
>> could be made for an external resource that was set-like.<br>
>><br>
>> I think what you want is something like gen:fset that has no methods,<br>
>> but is used for set authors to tag their set as having this property<br>
>> for the benefit of consumers (which cannot be enforced.) Your library<br>
>> would then consume fsets and not sets.<br>
>><br>
>> Jay<br>
>><br>
>><br>
>> On Wed, Oct 2, 2013 at 2:09 PM, Robby Findler<br>
>> <<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>> wrote:<br>
>> > If we do go this way, we should be careful about the subtyping<br>
>> > relationship<br>
>> > since we want a predicate that means "will not be mutated and I can rely<br>
>> > on<br>
>> > that to reason about my library's behavior" and if mutable sets are a<br>
>> > sub-thing of immutable ones, we might lose that (depending on how things<br>
>> > are<br>
>> > set up).<br>
>> ><br>
>> > Robby<br>
>> ><br>
>> ><br>
>> > On Wed, Oct 2, 2013 at 2:57 PM, Jay McCarthy <<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>><br>
>> > wrote:<br>
>> >><br>
>> >> No. Mutable sets would implement gen:set and then just have a few more<br>
>> >> methods in the gen:mset interface. Structs can implement any number of<br>
>> >> generics.<br>
>> >><br>
>> >> Jay<br>
>> >><br>
>> >> On Wed, Oct 2, 2013 at 1:31 PM, J. Ian Johnson <<a href="mailto:ianj@ccs.neu.edu">ianj@ccs.neu.edu</a>><br>
>> >> wrote:<br>
>> >> > This means I can't interchange between mutable and immutable sets for<br>
>> >> > my<br>
>> >> > functions that only need to read generic sets, unless we further<br>
>> >> > subdivide<br>
>> >> > and have gen:set-query gen:set-constructor gen:set-mconstruct.<br>
>> >> ><br>
>> >> > -Ian<br>
>> >> > ----- Original Message -----<br>
>> >> > From: "Jay McCarthy" <<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>><br>
>> >> > To: "Carl Eastlund" <<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>><br>
>> >> > Cc: "Racket Developers" <<a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a>><br>
>> >> > Sent: Wednesday, October 2, 2013 3:23:07 PM GMT -05:00 US/Canada<br>
>> >> > Eastern<br>
>> >> > Subject: Re: [racket-dev] Generics updates<br>
>> >> ><br>
>> >> > Regarding a point from RacketCon, I don't like that gen:set includes<br>
>> >> > functions like set-add! and set-remove!. I think that sets with<br>
>> >> > mutations are subclass of get:set and we should have a separate<br>
>> >> > gen:mset (or something) interface for mutable versions.<br>
>> >> ><br>
>> >> > I dislike that an obvious implementation of sets, hash tables, are<br>
>> >> > not<br>
>> >> > sets to gen:set, because there are operations that cannot be<br>
>> >> > performed<br>
>> >> > on them.<br>
>> >> ><br>
>> >> > I think that "X implements generic G" should imply "All functions of<br>
>> >> > G<br>
>> >> > work on X". But this is not the case with gen:set and hasheq sets,<br>
>> >> > for<br>
>> >> > instance.<br>
>> >> ><br>
>> >> > Jay<br>
>> >> ><br>
>> >> ><br>
>> >> > On Tue, Jul 23, 2013 at 9:37 AM, Carl Eastlund <<a href="mailto:cce@ccs.neu.edu">cce@ccs.neu.edu</a>><br>
>> >> > wrote:<br>
>> >> >> My work on adding gen:set, and related changes to define-generics<br>
>> >> >> and<br>
>> >> >> gen:dict, is ready for review and (hopefully) to push to the master<br>
>> >> >> branch.<br>
>> >> >> The branch moved in the process of cleaning things up, it's now at:<br>
>> >> >><br>
>> >> >>   <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>
>> >> >><br>
>> >> >> (The "from scratch" just refers to the process of rebuilding the git<br>
>> >> >> history, I didn't go out of my way to rewrite anything in the code<br>
>> >> >> base<br>
>> >> >> from<br>
>> >> >> scratch, although in some places a lot of code did move around.)<br>
>> >> >><br>
>> >> >> What's new in the branch:<br>
>> >> >><br>
>> >> >> - Generics now support a few new options<br>
>> >> >>   - #:fallbacks specifies fallback method implementations for<br>
>> >> >> instances<br>
>> >> >> with<br>
>> >> >> no implementation<br>
>> >> >>   - #:fast-defaults specifies instances on a "fast path", useful for<br>
>> >> >> built-in types<br>
>> >> >>   - #:defined-predicate gives a more intuitive and efficient<br>
>> >> >> interface<br>
>> >> >> than<br>
>> >> >> #:defined-table<br>
>> >> >>   - #:derive-property allows generics to piggy-back on existing<br>
>> >> >> struct<br>
>> >> >> properties<br>
>> >> >><br>
>> >> >> - Sets are now a generic datatype through gen:set<br>
>> >> >>   - lists are now sets<br>
>> >> >>   - the built-in set types are now documented as "hash sets"<br>
>> >> >>   - there are mutable and weak hash sets<br>
>> >> >>   - you can define new set types quickly with<br>
>> >> >> define-custom-set-types<br>
>> >> >>   - most set operations are now methods with fallbacks<br>
>> >> >>   - sets now support -copy and -clear operations, plus mutating [!]<br>
>> >> >> versions<br>
>> >> >> of operations<br>
>> >> >><br>
>> >> >> - Dictionaries have a few changes<br>
>> >> >>   - new macro define-custom-hash-types [*]<br>
>> >> >>   - most dict operations are now methods with fallbacks<br>
>> >> >>   - dicts now support -copy, -clear, -clear!, and -empty? operations<br>
>> >> >><br>
>> >> >> I've run some benchmarks and performance of the various generic<br>
>> >> >> operations<br>
>> >> >> are comparable to the current HEAD, so there should be no major<br>
>> >> >> performance<br>
>> >> >> changes with this patch.<br>
>> >> >><br>
>> >> >> [*] I've added define-custom-hash-types and define-custom-set-types<br>
>> >> >> rather<br>
>> >> >> than just adding make-custom-set akin to make-custom-hash because<br>
>> >> >> make-custom-hash is hard to use.  The documented behavior -- that<br>
>> >> >> any<br>
>> >> >> custom<br>
>> >> >> hash is equal to any other created with the same bindings and<br>
>> >> >> predicates /<br>
>> >> >> hash functions -- was never true and can be expensive or at least<br>
>> >> >> tricky to<br>
>> >> >> implement.  It seemed more sensible to just remove the erroneous<br>
>> >> >> documentation on make-custom-hash, and add the definition form to<br>
>> >> >> create<br>
>> >> >> constructors for new, explicitly-compatible dict and set types.<br>
>> >> >> Both<br>
>> >> >> definition forms bind predicates and constructors for new (set or<br>
>> >> >> dict)<br>
>> >> >> types with immutable, mutable, and weak variants that inter-operate.<br>
>> >> >><br>
>> >> >> If there are no serious issues brought up in the next day or two,<br>
>> >> >> I'll<br>
>> >> >> push<br>
>> >> >> it to the development branch, since our current release process<br>
>> >> >> isn't<br>
>> >> >> following HEAD.<br>
>> >> >><br>
>> >> >> Carl Eastlund<br>
>> >> >><br>
>> >> >> _________________________<br>
>> >> >>   Racket Developers list:<br>
>> >> >>   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
>> >> >><br>
>> >> ><br>
>> >> ><br>
>> >> ><br>
>> >> > --<br>
>> >> > Jay McCarthy <<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>><br>
>> >> > Assistant Professor / Brigham Young University<br>
>> >> > <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
>> >> ><br>
>> >> > "The glory of God is Intelligence" - D&C 93<br>
>> >> > _________________________<br>
>> >> >   Racket Developers list:<br>
>> >> >   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
>> >><br>
>> >><br>
>> >><br>
>> >> --<br>
>> >> Jay McCarthy <<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>><br>
>> >> Assistant Professor / Brigham Young University<br>
>> >> <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
>> >><br>
>> >> "The glory of God is Intelligence" - D&C 93<br>
>> >> _________________________<br>
>> >>   Racket Developers list:<br>
>> >>   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
>> ><br>
>> ><br>
>><br>
>><br>
>><br>
>> --<br>
>> Jay McCarthy <<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>><br>
>> Assistant Professor / Brigham Young University<br>
>> <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
>><br>
>> "The glory of God is Intelligence" - D&C 93<br>
><br>
><br>
<br>
<br>
<br>
--<br>
Jay McCarthy <<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>><br>
Assistant Professor / Brigham Young University<br>
<a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
<br>
"The glory of God is Intelligence" - D&C 93<br>
_________________________<br>
  Racket Developers list:<br>
  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
<br>
</blockquote></div>