2010-03-04 9 views
7

Sto esaminando il libro "Little Schemer" e sto facendo le varie funzioni. Generalmente finisco con la stessa versione dei libri, ma non con eqlist ?, che è una funzione per testare l'uguaglianza di due liste.Little Schemer eqlist? funzione - versione alternativa?

Ho provato a testare la mia versione e passa tutto ciò che lancio. Eppure è leggermente diverso dalla versione "Little Schemer", e mi piacerebbe l'opinione di qualcuno sul fatto che mi manchi qualcosa - sospetto che sia così.

La mia versione:

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

versione del libro:

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

E in entrambi i casi la definizione di 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))))) 

Grazie!

Joss Delage versione

+0

+1 per la domanda da The Little Schemer :-) – csl

risposta

6

Il libro si romperebbe se passato in un atomo o un elenco impropria (una coppia che non è una lista - qualcosa come (1 2 . 3)) come argomento. (Nota che funziona con '(), ovviamente - non è sicuro se TLS lo consideri come un atomo o meno.) Questo rende la tua funzione effettivamente più robusta, anche se forse meglio denominata eqv?/equal? rispetto a eqlist?. (Vedo equal? viene utilizzato in eqan? per testare uguaglianza numerica, ma tradizionalmente questo nome è attaccato ad una funzione di test di uguaglianza valore universale.)

Fondamentalmente, tuoi eqlist? opere su qualsiasi tipo di argomenti sotto le ipotesi che (1) atom? è in grado di dire coppie (cose con car e cdr) da non coppie (è la versione negata di pair?), (2) eqan? verifica l'uguaglianza di atomi, (3) tutto è o '() o una coppia o un atomo. (Beh, in realtà '() è un atomo nei miei occhi - e Petite Chez Scheme è d'accordo.) La versione del libro funziona su liste appropriate (incluso '()), fa ipotesi simili e ignora la possibilità di incontrare una lista impropria.

Non sarei sorpreso se una funzione di test di uguaglianza più robusta fosse presentata più avanti nel libro, ma non ce l'ho disponibile per il controllo. Ad ogni modo, la versione del libro di eqlist? che hai pubblicato sembra qualcosa inteso a illustrare le idee di base dietro le liste, non qualcosa che vorresti veramente utilizzare nella programmazione quotidiana. In effetti, la versione data di eqan? si interrompe in un ambiente senza restrizioni in cui sono presenti più tipi di dati atomici da considerare, tra i quali almeno le stringhe devono essere contabilizzate separatamente, invalidando quindi le ipotesi elencate nel secondo paragrafo sopra e rompere entrambe le versioni di eqlist?.

+0

Grande, grazie. – JDelage

1

ecco la mia versione:

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