2012-06-14 7 views
5

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 

Odpowiedz

3

W „zaprawiony Schemer” length jest wstępnie zdefiniowane tak:

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

Później w książce, poprzedni wynik jest uogólnione i length się na nowo pod względem Y! (kolejność aplikacji, imperatywny kombinator Y):

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

Pierwsza definicja z length przedstawione w pytaniu jest tylko krokiem pośrednim - z procedurą L dokładnie taką, jak zdefiniowano powyżej, nie należy jej przedefiniować. Celem tej części rozdziału jest dotarcie do drugiej definicji pokazanej w mojej odpowiedzi.

+1

Tak. To jest dużo lepsze. –

Powiązane problemy