nd does so using using the same `equal?' recursively, so a deep structure can be traversed. (equal? (list 1 2 3) (list 1 2 3)) ==> #t (equal? (list 1 2 3) (vector 1 2 3)) ==> #f For other objects, `equal?' compares as per `eqv?', which means characters and numbers are compared by type and value (and like `eqv?', exact and inexact numbers are not `equal?', even if their value is the same). (equal? 3 (+ 1 2)) ==> #t (equal? 1 1.0) ==> #f Hash tables are currently only compared as per `eq?', so two different tables are not `equal?', even if their contents are the same. `equal?' does not support circular data structures, it may go into an infinite loop if asked to compare two circular lists or similar. New application-defined object types (Smobs) have an `equalp' handler which is called by `equal?'. This lets an application traverse the contents or control what is considered `equal?' for two such objects. If there's no handler, the default is to just compare as per `eq?'.