Czytałem zaprawiony atrakcji: wszystko; i natknąłem tej definicji długości funkcjiDługość funkcji w „zaprawiony Schemer”
(define length
(let ((h (lambda (l) 0)))
(set! h (L (lambda (arg) (h arg))))
h))
Później mówią:
Jaki jest wartość (L (lambda (arg) (h arg)))? Jest to funkcja
(lambda (l)
(cond ((null? l) 0)
(else (add1 ((lambda (arg) (h arg)) (cdr l))))))
nie sądzę, ja to w pełni pojąć. Sądzę, że powinniśmy zdefiniować siebie jako ćwiczenie. Napisałem definicję L w definicji długości za pomocą letrec. Oto co napisał:
(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)))
Więc L wykonuje funkcję jako argument i zwraca jako wartość inną funkcję, która pobiera listę jako argument i wykonuje rekursji na liście. Czy w mojej interpretacji mam rację lub nie mam racji? Zresztą definicja działa
(length (list 1 2 3 4)) => 4
Tak. To jest dużo lepsze. –