On 22.06.2023 00:25, Philip McGrath wrote: > Hi, > > What is the recommended way for a library to customize `equal?` and `equal?` > -based hashing for new datatypes it defines? > > I know from [1] that `equal?` can be customized using GOOPS; however, some > projects do not use GOOPS (e.g. [2]), so it would seem more friendly for a > generic library to avoid it. Also, it is not clear if the same mechanism is > even an option for customizing `equal-hash` to match `equal?`. > > I'm looking for something like Racket's `gen:equal+hash` [3] or Chez Scheme's > `record-equal-procedure` and `record-hash-procedure` [4]. > > This came up while I was working on a portable version of the immutable > hash-table implementations from Racket-on-Chez. > > -Philip > > [1]: > https://www.gnu.org/software/guile/manual/html_node/GOOPS-Object-Miscellany.html > [2]: https://lists.gnu.org/archive/html/info-gnu/2023-05/msg00005.html > [3]: > https://docs.racket-lang.org/reference/Equality.html#%28part._.Implementing_.Equality_for_.Custom_.Types%29 > [4]: https://cisco.github.io/ChezScheme/csug9.5/objects.html#./objects:h14
Hi Philip, You can use SRFI 69 hash tables in Guile. This library offers a way to specify the equality and hash procedures that should be used by a hash table, e.g.: (import (srfi srfi-69)) (define (my-equal? x y) (equal? (foo x) (foo y))) (define (my-hash x) (hash (foo x))) ; standard 'hash' procedure also imported from SRFI 69 (define my-table (make-hash-table my-equal? my-hash)) Now any operation with my-table will use my-equal? and my-hash, which implement an equality logic based on the result of calling 'foo' on objects. Note that this doesn't affect the behavior of the standard 'equal?' procedure, it only affects the SRFI 69 hash table operations on the created hash table. I currently don't remember whether Guile's own non-portable hash table library supports the same feature. It probably does in some way. The R6RS, SRFI 125, and SRFI 126 libraries also support it. Guile supports R6RS, so you could use the (rnrs hashtables) library instead of SRFI 69 if you desire. SRFI 125 is an extension of 69, and SRFI 126 is an extension to R6RS hashtables, but neither is supported in Guile I believe. -- Taylan