`(equal? obj[1] obj[2])`procedureEqual? recursively compares the contents of pairs, vectors, and strings, applying eqv? on other objects such as numbers and symbols. A rule of thumb is that objects are generally equal? if they print the same. Equal? may fail to terminate if its arguments are circular data structures.

(equal? 'a 'a) ===> #t (equal? '(a) '(a)) ===> #t (equal? '(a (b) c) '(a (b) c)) ===> #t (equal? "abc" "abc") ===> #t (equal? 2 2) ===> #t (equal? (make-vector 5 'a) (make-vector 5 'a)) ===> #t (equal? (lambda (x) x) (lambda (y) y)) ===> unspecified