2010-03-04 15 views
7

Estoy repasando el libro "Little Schemer" y haciendo las diversas funciones. En general, termino con la misma versión que los libros, pero no para eqlist ?, que es una función para probar la igualdad de dos listas.Little Schemer eqlist? función - versión alternativa?

He intentado probar mi versión y pasa todo lo que arroje. Sin embargo, es un poco diferente de la versión de "Little Schemer", y me gustaría la opinión de alguien sobre si me estoy perdiendo algo, sospecho que ese es el caso.

Mi versión:

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

versión 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))))))) 

Y en ambos casos la definición de eqan es:

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

Gracias!

Joss Delage versión

+0

+1 para la pregunta de la pequeña Schemer :-) – csl

Respuesta

6

El libro se rompería si se aprueba en un átomo o una lista indebida (un par que no es una lista - algo así como (1 2 . 3)) como argumento. (Tenga en cuenta que funciona con '(), por supuesto, no estoy seguro de si TLS considera que esto es un átomo o no). Esto hace que su función sea realmente más robusta, aunque posiblemente sea mejor llamada eqv?/equal? que eqlist?. (Veo equal? se utiliza en eqan? para probar la igualdad numérica, pero, tradicionalmente, este nombre está unido a una función de prueba igualdad de valor universal.)

Básicamente, sus eqlist? funciona en cualquier tipo de argumentos bajo los supuestos de que (1) atom? es capaz de distinguir pares (cosas con car y cdr) de no pares (es la versión negada de pair?), (2) eqan? prueba la igualdad de átomos, (3) todo es '() o un par o un átomo. (Bueno, en realidad, '() es un átomo en mis ojos, y Petite Chez Scheme está de acuerdo). La versión del libro funciona en listas adecuadas (incluido '()), hace suposiciones similares y descarta la posibilidad de encontrar una lista incorrecta.

No me sorprendería que una función de prueba de igualdad más robusta se presentara más adelante en el libro, pero no la tengo disponible para verificar. De todos modos, la versión de libro de eqlist? que publicó parece ser algo para ilustrar las ideas básicas detrás de las listas, no algo que realmente desee usar en la programación diaria. De hecho, la versión dada de eqan? se rompería en un entorno no restringido donde hay que considerar más tipos de datos atómicos, entre los cuales al menos las cadenas tendrían que contabilizarse por separado, invalidando así las suposiciones enumeradas en el segundo párrafo anterior y rompiendo ambas versiones de eqlist?.

+0

Bien, muchas gracias. – JDelage

1

aquí es mi versión:

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