I am not sure, but I believe this is the algorithm used. Perhaps that will help you understand?
http://www.cs.indiana.edu/~dyb/pubs/equal.pdf Also, check out the tortoise and hare algorithm, described here: https://en.wikipedia.org/wiki/Cycle_detection Robby On Tue, Sep 13, 2016 at 9:25 AM, Dupéron Georges <[email protected]> wrote: > I'm writing a prop:equal+hash for a recursive data structure, and I noticed > that it takes several comparisons of pairs of values which are eq? before > equal? realises that there is a cycle, and stops. > > Below is the code for the trivial case, where the implementation of equality > just calls itself on the same values. > > #lang racket > > (struct s () > #:property prop:equal+hash > (list (λ (a b r) (display ".") (r a b)) > (λ (a r) (display "!") (r a)) > (λ (a r) (display "!") (r a)))) > > (equal? (s) (s)) ;; => prints 26 "." > (equal-hash-code (s)) ;; => prints 128 "!" > (equal-secondary-hash-code (s)) ;; => prints 128 "!" > > Why doesn't it stop immediately after the first cycle? > > Also, where do these magical numbers (26 and 128) come from? I grepped the C > source, but couldn't find anything relevant. The numbers 26 and 128 seem to > be independent of the equality function, so it does not sound like a change > of behaviour once the stack overflows, for example. > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

