Я прохожу "Маленького Интригана" книга и делаю различные функции. Обычно я заканчиваю с той же версией как книги, но не для eqlist?, который является функцией для тестирования равенства двух списков.
Я попытался тестировать свою версию, и она передает что-либо, что я бросаю в нее. Все же это немного отличается от "Маленького Интригана" версия, и я хотел бы чье-то мнение о том, пропускаю ли я что-то - я подозреваю, что это имеет место.
Моя версия:
(define eqlist?
(lambda (list1 list2)
(cond
((and (null? list1)(null? list2))#t)
((or (null? list1)(null? list2))#f)
((and (atom? list1)(atom? list2))(eqan? list1 list2))
((or (atom? list1)(atom? list2)) #f)
(else
(and(eqlist? (car list1) (car list2))
(eqlist? (cdr list1) (cdr list2)))))))
Версия книги:
(define eqlist2? ;This is Little Schemer's version
(lambda (list1 list2)
(cond
((and (null? list1)(null? list2)) #t)
((or (null? list1)(null? list2)) #f)
((and (atom? (car list1))(atom? (car list2)))
(and (eqan? (car list1)(car list2))(eqlist2? (cdr list1)(cdr list2))))
((or (atom? (car list1))(atom? (car list2))) #f)
(else
(and (eqlist2? (car list1)(car list2))
(eqlist2? (cdr list1)(cdr list2)))))))
И в обоих случаях определение eqan:
(define eqan?
(lambda (a1 a2)
(cond
((and (number? a1)(number? a2)) (equal? a1 a2))
((or (number? a1)(number? a2)) #f)
(else (eq? a1 a2)))))
Спасибо!
Joss Delage
Книжная версия сломается, если передать ее атомом. или неправильный список (пара, которая не является списком - что-то вроде (1 2. 3)
) в качестве аргумента. (Обратите внимание, что он, конечно, работает с '()
- не уверен, считает ли TLS это атомом или нет.) Это делает вашу функцию на самом деле более надежной, хотя, возможно, лучше назвать eqv ?
/ равно?
, чем eqlist?
. (Я вижу equal?
используется в eqan?
для проверки числового равенства, но традиционно это имя присваивается функции проверки равенства универсальных значений.)
По сути, ваш ] eqlist?
работает с аргументами любого типа в предположении, что (1) атом?
может определять пары (вещи с car
и cdr
) от непарных (это отрицательная версия пары ?
), (2) eqan?
проверяет равенство атомов, (3) все либо '()
или пара, или атом. (Ну, на самом деле '()
- это атом в моих глазах - и Petite Chez Scheme соглашается.) Книжная версия работает с правильными списками (включая '()
), делает аналогичные предположения и игнорирует возможность встретить неправильный список.
Я не удивлюсь, если позже в книге будет представлена более надежная функция проверки равенства, но у меня нет ее для проверки. В любом случае, опубликованная вами книжная версия eqlist?
кажется чем-то, предназначенным для иллюстрации основных идей, лежащих в основе списков, а не тем, что вы действительно хотели бы использовать в повседневном программировании. Фактически, данная версия eqan?
может выйти из строя в неограниченной среде, где необходимо учитывать больше атомарных типов данных, среди которых, по крайней мере, строки должны быть учтены отдельно, что делает недействительными предположения. перечисленные во втором абзаце выше и нарушающие обе версии eqlist?
.