guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Equality and hashing for new datatypes


From: Taylan Kammer
Subject: Re: Equality and hashing for new datatypes
Date: Thu, 22 Jun 2023 13:33:06 +0200
User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]