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
Sí. Esto es mucho mejor. –