Pregunta

Voy a través del libro "Little Schemer", y haciendo las diversas funciones. Generalmente termino con la misma versión que los libros, pero no para eqlist ?, que es una función para probar la igualdad de las dos listas.

He intentado probar mi versión y pasa cualquier cosa que lanzar en él. Sin embargo, es ligeramente diferente de la versión "Little Schemer", y me gustaría la opinión de alguien sobre si me falta algo -. Sospecho que 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)))))))

La 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

¿Fue útil?

Solución

La versión del 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. (Nota que hace el trabajo con '(), por supuesto - no estoy seguro si TLS considera que este es un átomo o no). Esto hace que la función de su realidad más sólida, aunque posiblemente mejor nombrado eqv? / equal? que eqlist?. (Veo equal? se utiliza en eqan? a prueba de igualdad numérica, pero, tradicionalmente, este nombre está unido a una función de prueba igualdad de valor universal.)

Básicamente, su eqlist? funciona en cualquier tipo de argumentos bajo los supuestos de que (1) atom? es capaz de decir pares (cosas con car y cdr) de los no pares (que es la versión negada de pair?), (2) eqan? prueba la igualdad de los átomos, (3) todo está bien '() o un par o un átomo. (Bueno, en realidad '() es un átomo en los ojos -. Y Petite Chez Esquema de acuerdo). La versión del libro funciona en las listas apropiadas (incluyendo '()), hace suposiciones e ignora similares la posibilidad de encontrar una lista inadecuada

Me no se sorprenda si una función de prueba de la igualdad más robusto fue presentada más adelante en el libro, pero no tenerlo disponible para comprobar. De todos modos, la versión del libro de eqlist? informados parece como algo destinado a ilustrar las ideas básicas detrás de las listas, no es algo que realmente querrá usar en la programación del día a día. De hecho, la versión dada de eqan? se rompería en un ambiente sin restricciones donde hay más tipos atómicos de los datos a tener en cuenta, entre los cuales por lo menos cuerdas tendría que dará cuenta por separado, lo cual invalida los supuestos enumerados en el segundo párrafo anterior y romper las dos versiones de eqlist?.

Otros consejos

aquí está 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)))))))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top