# [plt-scheme] struct-eqv?

At Tue, 10 Mar 2009 18:14:27 -0600, Chongkai Zhu wrote:
>* Stephen De Gabrielle wrote:
*>* > but is there a predicate for determining two different structs have
*>* > the same field values?
*>*
*>* Here I assume you are asking about struct-equal? instead of struct-eqv?.
*>*
*>* None is build-in, but you can write one as:
*>*
*>* (define (struct-equal? v1 v2)
*>* (equal? (struct->vector v1)
*>* (struct->vector v2)))
*
Actually, when that works, you can just use `equal?' directly on the
structures.
But `equal?' works only for transparent structure types, such as
(define-struct point (x y) #:transparent)
If you want to keep a structure type opaque, you can specialize
`equal?' by implementing the `prop:equal+hash' property:
(define-struct point (x y)
#:property prop:equal+hash
(list
(lambda (a b equal?-recur)
(and (equal?-recur (point-x a) (point-x b))
(equal?-recur (point-y a) (point-y b))))
(lambda (a hash-code-recur)
(+ (hash-code-recur (point-x a))
(* 3 (hash-code-recur (point-x b)))))
(lambda (a hash2-code-recur)
(+ (hash2-code-recur (point-x a))
(hash2-code-recur (point-x b))))))