2010-03-04 2 views
7

Ich gehe durch das Buch "Little Schemer" und mache die verschiedenen Funktionen. Im Allgemeinen habe ich die gleiche Version wie die Bücher, aber nicht für eqlist?, Die eine Funktion ist, um die Gleichheit zweier Listen zu testen.Little Schemer eqlist? Funktion - alternative Version?

Ich habe versucht, meine Version zu testen, und es passiert alles, was ich damit werfe. Aber es ist ein bisschen anders als die "Little Schemer" -Version, und ich möchte jemandes Meinung darüber, ob ich etwas vermisse - 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))))))) 

Die Version des Buches:

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

Thank you!

Joss Delage

+0

+1 für Frage von The Little Schemer :-) – csl

Antwort

6

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. (Beachten Sie, dass es natürlich mit '() funktioniert - nicht sicher, ob TLS dies als Atom betrachtet oder nicht.) Dies macht Ihre Funktion tatsächlich robuster, obwohl sie möglicherweise besser eqv?/equal? genannt wird als eqlist?. (Ich sehe equal? in eqan? verwendete numerische Gleichheit zu testen, aber traditionell ist dieser Name auf eine universellen Wert Gleichheit Testfunktion angebracht.)

Grundsätzlich Ihre eqlist? Arbeiten auf jede Art von Argumenten unter der Annahme, dass (1) atom? ist in der Lage Paare (Dinge mit car und cdr) von Nicht-Paaren zu unterscheiden (es ist die negierte Version von pair?), (2) eqan? testet die Gleichheit der Atome, (3) alles ist entweder '() oder ein Paar oder ein Atom. (Nun, eigentlich ist '() ein Atom in meinen Augen - und Petite Chez Scheme stimmt zu.) Die Buchversion funktioniert auf richtigen Listen (einschließlich '()), macht ähnliche Annahmen und ignoriert die Möglichkeit, auf eine falsche Liste zu stoßen.

Ich wäre nicht überrascht, wenn später im Buch eine robustere Gleichheitstestfunktion vorgestellt würde, aber ich habe sie nicht zur Überprüfung verfügbar. Wie auch immer, die Buchversion von eqlist?, die du gepostet hast, scheint etwas zu sein, das die grundlegenden Ideen hinter Listen illustrieren soll, nicht etwas, das du eigentlich im täglichen Programmieren verwenden möchtest. Tatsächlich würde die gegebene Version von eqan? in einer unbeschränkten Umgebung brechen, in der es mehr atomare Datentypen zu berücksichtigen gilt, unter denen mindestens Zeichenketten separat berücksichtigt werden müssten, wodurch die im zweiten Absatz oben aufgeführten Annahmen ungültig werden Brechen beider Versionen von eqlist?.

+0

Großartig, danke. – JDelage

1

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))))))) 
Verwandte Themen