Frage

Ich werde durch das „Little Schemer“ Buch und die verschiedenen Funktionen zu tun. Im Allgemeinen ich mit der gleichen Version wie die Bücher am Ende, aber nicht für eqlist ?, die eine Funktion ist, die Gleichheit von zwei Listen zu testen.

Ich habe meine Version versucht zu testen und es geht alles, was ich an ihm werfen. Doch es ist etwas anders als die „Little Schemer“ Version, und ich würde jemand mit der Stellungnahme möchte, ob ich etwas fehle -. Ich vermute, dass das der Fall ist

Meine Version:

(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)))))))

Das Buch der Version:

(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)))))))

Und in beiden Fällen ist die Definition von eqan ist:

(define eqan?
  (lambda (a1 a2)
    (cond
      ((and (number? a1)(number? a2)) (equal? a1 a2))
      ((or (number? a1)(number? a2)) #f)
      (else (eq? a1 a2)))))

Danke!

Joss Delage

War es hilfreich?

Lösung

Die Buchversion brechen würde, wenn in einem Atom oder eine falsche Liste übergeben (ein Paar, das keine Liste ist - so etwas wie (1 2 . 3)) als Argument. (Hinweis funktioniert es mit '(), natürlich - nicht sicher, ob TLS hält dies für ein Atom oder nicht.) Das macht Ihre Funktion tatsächlich robusten, auch wenn sie möglicherweise besser eqv? / equal? als eqlist? benannt. (Ich sehe equal? in eqan? zu Test numerischer Gleichheit verwendet, aber traditionell dieser Name ist an eine universellen Wert Gleichheit Prüffunktion.)

Im Grunde Ihre eqlist? auf jede Art von Argumenten unter den Annahmen arbeitet, dass (1) atom? der Lage ist, Paare zu erzählen (Dinge mit car und cdr) aus nicht-Paare (es ist die negierte Version von pair?), (2) eqan? die Gleichheit von Atomen Tests, (3) ist alles entweder '() oder ein Paar oder ein Atom. (Na ja, eigentlich '() ein Atom in meinen Augen -. Und Petite Chez Scheme stimmt). Die Buchversion funktioniert auf richtige Listen (einschließlich '()), macht ähnliche Annahmen und verkennen die Möglichkeit, eine falsche Liste der Begegnung mit

ich würde nicht überrascht sein, wenn eine robustere Gleichheit Testfunktion später in dem Buch vorgestellt wurde, aber ich habe nicht verfügbar, es zu überprüfen. Auf jeden Fall scheint die Buchversion von eqlist? Sie auf dem Laufenden, wie etwas die grundlegenden Ideen hinter Listen zu veranschaulichen soll, nicht etwas, das man würde tatsächlich in Tag-zu-Tag-Programmierung verwenden möchten. In der Tat, in einer unbeschränkten Umgebung die gegebene Version von eqan? brechen würde, wo es mehr Atom Arten von Daten ist zu berücksichtigen, unter denen zumindest aber Strings separat ausgewiesen werden müßte, damit die Annahmen im zweiten Absatz aufgeführten entkräftet oben und brechen beide Versionen von eqlist?.

Andere Tipps

Hier ist meine Version:

(define eqlist?
    (lambda (l1 l2)
      (cond
        ((and (null? l1) (null? l2))
         #t)
        ((and (atom? (car l1)) (atom? (car l2)))
         (and (eq? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2))))
        (else
         (and (eqlist? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2)))))))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top