[racket-dev] Generics updates

From: Carl Eastlund (cce at ccs.neu.edu)
Date: Tue Jul 23 11:37:15 EDT 2013

My work on adding gen:set, and related changes to define-generics and
gen:dict, is ready for review and (hopefully) to push to the master
branch.  The branch moved in the process of cleaning things up, it's now at:

  https://github.com/carl-eastlund/racket/tree/generics-from-scratch

(The "from scratch" just refers to the process of rebuilding the git
history, I didn't go out of my way to rewrite anything in the code base
from scratch, although in some places a lot of code did move around.)

What's new in the branch:

- Generics now support a few new options
  - #:fallbacks specifies fallback method implementations for instances
with no implementation
  - #:fast-defaults specifies instances on a "fast path", useful for
built-in types
  - #:defined-predicate gives a more intuitive and efficient interface than
#:defined-table
  - #:derive-property allows generics to piggy-back on existing struct
properties

- Sets are now a generic datatype through gen:set
  - lists are now sets
  - the built-in set types are now documented as "hash sets"
  - there are mutable and weak hash sets
  - you can define new set types quickly with define-custom-set-types
  - most set operations are now methods with fallbacks
  - sets now support -copy and -clear operations, plus mutating [!]
versions of operations

- Dictionaries have a few changes
  - new macro define-custom-hash-types [*]
  - most dict operations are now methods with fallbacks
  - dicts now support -copy, -clear, -clear!, and -empty? operations

I've run some benchmarks and performance of the various generic operations
are comparable to the current HEAD, so there should be no major performance
changes with this patch.

[*] I've added define-custom-hash-types and define-custom-set-types rather
than just adding make-custom-set akin to make-custom-hash because
make-custom-hash is hard to use.  The documented behavior -- that any
custom hash is equal to any other created with the same bindings and
predicates / hash functions -- was never true and can be expensive or at
least tricky to implement.  It seemed more sensible to just remove the
erroneous documentation on make-custom-hash, and add the definition form to
create constructors for new, explicitly-compatible dict and set types.
Both definition forms bind predicates and constructors for new (set or
dict) types with immutable, mutable, and weak variants that inter-operate.

If there are no serious issues brought up in the next day or two, I'll push
it to the development branch, since our current release process isn't
following HEAD.

Carl Eastlund
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/dev/archive/attachments/20130723/21315a0a/attachment.html>

Posted on the dev mailing list.