Next: iklib records defs comparison, Previous: iklib records defs printer, Up: iklib records defs [Index]
In a use of the syntax define-record-type, the definition
clause:
(equality-predicate ?expr)
allows the specification of an expression ?expr which must evaluate to a custom equality–predicate protocol–function for instances of the record–type; iklib records equality, for the API that manipulates record’s equality predicates.
If the record–type has a parent: the protocol function is applied to
the equality predicate of the parent (or #f if the parent has no
equality predicate) and the resulting value must be a function, which
becomes the equality predicate of the record–type.
If the record–type has no parent: the protocol function is called as a thunk and the resulting value must be a function, which becomes the equality predicate of the record–type.
The equality predicate is used when comparing records of the same
record–type with equal?, but not with eqv?.
In the following example, we define a custom equality predicate that
just compares all the fields; the only difference between the default
equality predicate record=? and this implementation, is that this
one compares the fields using = rather than equal?:
(define-record-type <duo>
  (fields one two)
  (equality-predicate
    (lambda ()
      (lambda (A B)
        (and (= (<duo>-one A)
                (<duo>-one B))
             (= (<duo>-two A)
                (<duo>-two B)))))))
(equal? (make-<duo> 1 2) (make-<duo> 1 2))      ⇒ #t
(equal? (make-<duo> 1 2) (make-<duo> 1 99))     ⇒ #f
In the following example, we define a custom equality predicate that compares only some of the fields:
(define-record-type <duo>
  (fields one two)
  (equality-predicate
    (lambda ()
      (lambda (A B)
        (= (<duo>-one A)
           (<duo>-one B))))))
(equal? (make-<duo> 1 2) (make-<duo> 1 99))     ⇒ #t
(equal? (make-<duo> 1 2) (make-<duo> 99 2))     ⇒ #f
this kind of equality predicate is especially useful, for example, when some fields are used to memoise values.
Next: iklib records defs comparison, Previous: iklib records defs printer, Up: iklib records defs [Index]