I can see why an eq-set and an eqv-set can't be union-ed without additional 
information about the desired result type. 

But if we had two different implementation of the eq-set API we could easily 
define unions as derived code; that's the point of OO. 






On Aug 22, 2013, at 12:14 PM, Carl Eastlund wrote:

> Set-union never worked for even different hash set representations.  Even 
> before I touched the code, the union of an eq set and an eqv set, for 
> instance, caused a runtime error.
> 
> Generics do not have multiple dispatch.  That's not a mechanism we have right 
> now.  And "fallbacks" are for when there's no method implemented for a given 
> receiver value, they're not particularly related to a question of "are these 
> things the same type".
> 
> I chose to keep the semantics that union and operations like it only work 
> with the same representation.  Partly because that's how things already were, 
> and partly to set the precedent that generics authors don't have to write two 
> versions of every method.  Perhaps this wasn't the best idiom, but it's what 
> I wrote.  Perhaps there's a better idiom for fallbacks that makes this work 
> more cleanly.  Anyway, right now, generic sets are designed so you can use 
> any one representation, but they don't combine representations.
> 
> Carl Eastlund
> 
> 
> On Thu, Aug 22, 2013 at 9:03 AM, J. Ian Johnson <i...@ccs.neu.edu> wrote:
> No, it doesn't seem to be using the fallback in this case.
> 
> ianj@sampson:~/racket/racket/bin$ ./racket -il xrepl
> Welcome to Racket v5.90.0.8.
> -> (set-union '() (set))
> ; in-list: contract violation
> ;   expected: list?
> ;   given: (set)
> ; [,bt for context]
> ->
> 
> -Ian
> ----- Original Message -----
> From: "Sam Tobin-Hochstadt" <sa...@cs.indiana.edu>
> To: "J. Ian Johnson" <i...@ccs.neu.edu>, "Carl Eastlund" <c...@ccs.neu.edu>
> Cc: dev@racket-lang.org, "Matthew Flatt" <mfl...@cs.utah.edu>
> Sent: Thursday, August 22, 2013 8:51:30 AM GMT -05:00 US/Canada Eastern
> Subject: Re: [racket-dev] Lists aren't sets, but have set-like operations
> 
> Wait, `set-union` of two different set representations doesn't work?
> 
> Sam
> 
> On Thu, Aug 22, 2013 at 8:07 AM, J. Ian Johnson <i...@ccs.neu.edu> wrote:
> > You misunderstand. I used set-union, but single dispatch saw '() and used 
> > list-union for the '() (set) combination.
> > -Ian
> > ----- Original Message -----
> > From: "Sam Tobin-Hochstadt" <sa...@cs.indiana.edu>
> > To: "J. Ian Johnson" <i...@ccs.neu.edu>
> > Cc: dev@racket-lang.org, "Matthew Flatt" <mfl...@cs.utah.edu>
> > Sent: Thursday, August 22, 2013 8:02:50 AM GMT -05:00 US/Canada Eastern
> > Subject: Re: [racket-dev] Lists aren't sets, but have set-like operations
> >
> >
> >
> > But 'list-union' is not a generic operation so it isn't surprising that 
> > this didn't work. To do this generically, you'd need to use 'set-union'.
> >
> > Sam
> > On Aug 22, 2013 7:59 AM, "J. Ian Johnson" < i...@ccs.neu.edu > wrote:
> >
> >
> > The problem manifested itself when I got an exception that in-list can't be 
> > called on (set), which really confused me. (set? '()) answered true, so it 
> > tried to do (list-union '() (set)), which failed.
> > Generic sets as they are don't work generically. Some action should be 
> > taken. Either set? means what it once did, or we do some awfully slow 
> > multiple dispatch for set operations. My bias shows.
> > -Ian
> > ----- Original Message -----
> > From: "Matthew Flatt" < mfl...@cs.utah.edu >
> > To: "Carl Eastlund" < c...@ccs.neu.edu >
> > Cc: "J. Ian Johnson" < i...@ccs.neu.edu >, "dev" < dev@racket-lang.org >
> > Sent: Thursday, August 22, 2013 7:22:25 AM GMT -05:00 US/Canada Eastern
> > Subject: Re: [racket-dev] Lists aren't sets, but have set-like operations
> >
> > How much should we prioritize backward compatibility in this case?
> >
> > One possibility is to make `set?' mean `hash-set?', and add
> > `generic-set?' in place of the current `set?'. That's uglier,
> > obviously, but it would be better if we want to prioritize backward
> > compatibility.
> >
> > At Wed, 21 Aug 2013 19:14:06 -0400, Carl Eastlund wrote:
> >> Ah, yes. The set? predicate no longer distinguishes a representation.
> >> There are several predicates for the original set type, now called "hash
> >> sets": set-eq?, set-eqv?, set-equal?, set-mutable?, set-immtuable?, and
> >> set-weak?. I didn't add the basic "hash-set?", but perhaps I should. It's
> >> a weird name, since "hash-set" and "hash-set!" are already existing,
> >> unrelated functions.
> >>
> >> Carl Eastlund
> >>
> >>
> >> On Wed, Aug 21, 2013 at 7:08 PM, J. Ian Johnson < i...@ccs.neu.edu > wrote:
> >>
> >> > Okay, I can abide. However, that doesn't really get at my frustration. 
> >> > I'm
> >> > using the set constructor, that appears to now be an immutable-custom-set
> >> > with make-immutable-hash as its make-table. So what I'm looking for is 
> >> > not
> >> > set?, but set-immutable?, as it's a distinct (family of) struct types 
> >> > that
> >> > won't clash with the primitive data that I'm otherwise using.
> >> > -Ian
> >> > ----- Original Message -----
> >> > From: "Carl Eastlund" < c...@ccs.neu.edu >
> >> > To: "J. Ian Johnson" < i...@ccs.neu.edu >
> >> > Cc: "dev" < dev@racket-lang.org >
> >> > Sent: Wednesday, August 21, 2013 6:58:56 PM GMT -05:00 US/Canada Eastern
> >> > Subject: Re: [racket-dev] Lists aren't sets, but have set-like operations
> >> >
> >> >
> >> > Ian, sets are now a generic datatype, like dictionaries. Association 
> >> > lists
> >> > are dictionaries, and lists are now sets. They're also streams and
> >> > sequences. They're not just "set-like".
> >> >
> >> >
> >> >
> >> > Carl Eastlund
> >> >
> >> >
> >> > On Wed, Aug 21, 2013 at 6:56 PM, J. Ian Johnson < i...@ccs.neu.edu >
> >> > wrote:
> >> >
> >> >
> >> > I just wasted about 2 hours tracking down a bug that ended up being due 
> >> > to
> >> > (set? '()) now evaluating to #t. I have no problems with set-union,
> >> > intersection, etc. being defined for lists, but to treat lists as sets
> >> > always is perverse to me. The contracts for set operations should use
> >> > set-like? for (or/c set? list?) and keep the two constructions separate.
> >> >
> >> > This conflation is almost as bad as treating empty list as false.
> >> >
> >> > -Ian
> >> > _________________________
> >> > Racket Developers list:
> >> > http://lists.racket-lang.org/dev
> >> >
> >> >
> >> >
> >> >
> >> _________________________
> >> Racket Developers list:
> >> http://lists.racket-lang.org/dev
> > _________________________
> > Racket Developers list:
> > http://lists.racket-lang.org/dev
> 
> 
> _________________________
>  Racket Developers list:
>  http://lists.racket-lang.org/dev

_________________________
  Racket Developers list:
  http://lists.racket-lang.org/dev

Reply via email to