2012-06-14 15 views
5

He estado leyendo El sazonado Schemer y me encontré con esta definición de la longitud funciónfunción de longitud en "The sazonado Schemer"

(define length 
    (let ((h (lambda (l) 0))) 
    (set! h (L (lambda (arg) (h arg)))) 
    h)) 

Posteriormente se dicen:

¿Cuál es el valor de (L (lambda (arg) (h arg)))? Es la función

(lambda (l) 
    (cond ((null? l) 0) 
    (else (add1 ((lambda (arg) (h arg)) (cdr l)))))) 

no creo que comprendo plenamente. Supongo que se supone que debemos definir L nosotros mismos como un ejercicio. Escribí una definición de L dentro de la definición de longitud usando letrec. Aquí está lo que escribí:

(define length 
    (let ((h (lambda (l) 0))) 
    (letrec ((L 
       (lambda (f) 
       (letrec ((LR 
          (lambda (l) 
          (cond ((null? l) 0) 
            (else 
            (+ 1 (LR (cdr l)))))))) 
        LR))))     
    (set! h (L (lambda (arg) (h arg)))) 
    h))) 

Así, L toma una función como argumento y devuelve como valor de otra función que toma una lista como argumento y realiza una recursividad en una lista. ¿Estoy correcto o irremediablemente equivocado en mi interpretación? De todos modos la definición funciona

(length (list 1 2 3 4)) => 4 

Respuesta

3

En "El sazonado Schemer" length se define inicialmente como esto:

(define length 
    (let ((h (lambda (l) 0))) 
    (set! h (lambda (l) 
       (if (null? l) 
        0 
        (add1 (h (cdr l)))))) 
    h)) 

Más adelante en el libro, el resultado anterior se generaliza y length se redefine en términos de Y! (el orden aplicativo, imperativo Y combinador) como este:

(define Y! 
    (lambda (L) 
    (let ((h (lambda (l) 0))) 
     (set! h (L (lambda (arg) (h arg)))) 
     h))) 

(define L 
    (lambda (length) 
    (lambda (l) 
     (if (null? l) 
      0 
      (add1 (length (cdr l))))))) 

(define length (Y! L)) 

La primera definición de length que se muestra en la pregunta es solo un paso intermedio: con el procedimiento L exactamente como se definió anteriormente, no se supone que deba redefinirlo. El objetivo de esta parte del capítulo es llegar a la segunda definición que se muestra en mi respuesta.

+1

Sí. Esto es mucho mejor. –

Cuestiones relacionadas