Domanda

Sto attraversando il libro "Schemer Little", e facendo le varie funzioni. In generale io alla fine con la stessa versione dei libri, ma non per eqlist ?, che è una funzione per testare l'uguaglianza delle due liste.

Ho provato a testare la mia versione e passa qualcosa che buttare a questo. Eppure è leggermente diversa dalla versione "Schemer Little", e vorrei parere di qualcuno se mi manca qualcosa -. Ho il sospetto che sia il caso

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

La 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

È stato utile?

Soluzione

La versione del 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 funziona con '(), ovviamente - non so se TLS ritiene che questo sia un atomo o no.) In questo modo la funzione in realtà più solida, anche se forse meglio chiamato eqv? / equal? di eqlist?. (Vedo equal? viene utilizzato in eqan? per prova uguaglianza numerica, ma tradizionalmente questo nome è attaccato ad una funzione di test di uguaglianza valore universale.)

In sostanza, il vostro eqlist? funziona su qualsiasi tipo di argomenti in base alle ipotesi che (1) atom? è in grado di dire coppie (le cose con car e cdr) dai 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 libro funziona su liste corrette (tra cui '()), formula ipotesi e trascura simili la possibilità di incontrare un elenco improprio

non sarei sorpreso se una più robusta funzione di test di uguaglianza è stato presentato più avanti nel libro, ma non averlo a disposizione per controllare. In ogni caso, la versione del libro di eqlist? hai postato sembra che qualcosa lo scopo di illustrare le idee di base dietro elenchi, non qualcosa che ci si vuole realmente utilizzare nella programmazione giorno per giorno. In effetti, la versione data di eqan? avrebbe rotto in un ambiente senza restrizioni dove c'è più tipi atomici di dati da prendere in considerazione, tra le quali per lo meno stringhe avrebbe bisogno di essere contabilizzati separatamente, invalidando così le ipotesi di cui al secondo comma di cui sopra e rompendo entrambe le versioni di eqlist?.

Altri suggerimenti

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)))))))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top