Маленький Интриган eqlist? функция - альтернативная версия?

Я прохожу "Маленького Интригана" книга и делаю различные функции. Обычно я заканчиваю с той же версией как книги, но не для 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

7
задан Chris Jester-Young 5 March 2010 в 00:43
поделиться

1 ответ

Книжная версия сломается, если передать ее атомом. или неправильный список (пара, которая не является списком - что-то вроде (1 2. 3) ) в качестве аргумента. (Обратите внимание, что он, конечно, работает с '() - не уверен, считает ли TLS это атомом или нет.) Это делает вашу функцию на самом деле более надежной, хотя, возможно, лучше назвать eqv ? / равно? , чем eqlist? . (Я вижу equal? ​​ используется в eqan? для проверки числового равенства, но традиционно это имя присваивается функции проверки равенства универсальных значений.)

По сути, ваш ] eqlist? работает с аргументами любого типа в предположении, что (1) атом? может определять пары (вещи с car и cdr ) от непарных (это отрицательная версия пары ? ), (2) eqan? проверяет равенство атомов, (3) все либо '() или пара, или атом. (Ну, на самом деле '() - это атом в моих глазах - и Petite Chez Scheme соглашается.) Книжная версия работает с правильными списками (включая '() ), делает аналогичные предположения и игнорирует возможность встретить неправильный список.

Я не удивлюсь, если позже в книге будет представлена ​​более надежная функция проверки равенства, но у меня нет ее для проверки. В любом случае, опубликованная вами книжная версия eqlist? кажется чем-то, предназначенным для иллюстрации основных идей, лежащих в основе списков, а не тем, что вы действительно хотели бы использовать в повседневном программировании. Фактически, данная версия eqan? может выйти из строя в неограниченной среде, где необходимо учитывать больше атомарных типов данных, среди которых, по крайней мере, строки должны быть учтены отдельно, что делает недействительными предположения. перечисленные во втором абзаце выше и нарушающие обе версии eqlist? .

6
ответ дан 7 December 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: