SICP 2.54

equal?を実装する。たしかLittle Schemerあたりに出てた。

(define (equal? a b)
  (cond ((not (pair? a)) (eq? a b))
        ((not (pair? b)) #f)
        ((null? a) (null? b))
        (else (and (equal? (car a) (car b))
                   (equal? (cdr a) (cdr b))))))

; test
(equal? '(1 2 a b) '(1 2 a b)) ; #t
(equal? '(1 2 a b) '(1 2 a)) ; #f
(equal? '(1 (2 (3) 4) a) '(1 (2 (3) 4) a)) ; #t
(equal? '(1 (2 (3) 4) a) '(1 (2 (3) (4) a))) ; #f
(equal? '(1) 1) ; #f