equal?

W ćwiczeniu 2.54 autorzy proszą nas o napisanie funkcji equal? zdolnej do porównywania list. Jej definicja wynika bezpośrednio z opisu.

(define (equal? a b)
(if (and (pair? a) (pair? b))
(and (equal? (car a) (car b))
(equal? (cdr a) (cdr b)))
(eq? a b)))

Implementacja ta radzi sobie doskonale z symbolami i (dowolnie zagnieżdżonymi) listami symboli, nie bierze jednak pod uwagę liczb. Jeżeli przyjmiemy, tak jak radzą nam autorzy w przypisie, że dwie liczby są równe, jeżeli ich wartości numeryczne są równe, to otrzymamy następującą implementację:

(define (equal? a b)
(cond
[(and (pair? a) (pair? b))
(and (equal? (car a) (car b))
(equal? (cdr a) (cdr b)))]
[(and (number? a) (number? b))
(= a b)]
[else
(eq? a b)]))

Komentuj wpis