2017-10-18 11 views
0

Ich frage mich, wie der folgende Code zu 3. wertetErklärung der Bewertung für dieses Verfahren Scheme lambda mit

(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y))) 

(foo 3) 

Ich habe für eine Weile es zu betrachten und kann nicht scheinen zu verstehen, warum die Auswertung nicht zur Folge hat in 9. Könnte jemand eine detaillierte Schritt-für-Schritt-Anleitung geben, wie dies zu 3 ausgewertet wird?

Antwort

3

Beginnen wir damit, den Code in einer Weise einrücken, dass es einfacher zu verstehen:

(define (foo y) 
    ((lambda (x) y) 
    ((lambda (y) (* y y)) 
    y))) 

Nun wollen wir es bewerten, von innen nach außen:

(define (foo y) 
    ((lambda (x) y) 
    ((lambda (y) (* y y)) 
    3))) ; pass the parameter 

(define (foo y) 
    ((lambda (x) y) 
    (* 3 3))) ; evaluate innermost lambda 

(define (foo y) 
    ((lambda (x) y) 9)) ; pass the result of evaluation 

Aha! Das ist, wo wir die 3 bekommen. Auch wenn wir ein 9 als Parameter (gebunden an x) vorbei sind, sind wir einfach die Rückgabe des Werts der äußersten y Parameter, der 3 der ganzen Zeit war:

=> 3 
+0

Oh das macht Sinn. Vielen Dank – MastRofDsastR

1

Mit let Umschreiben,

(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y))) 

(foo 3) 
= 
(let ([y 3])         ; by application 
    ((lambda (x) y) ((lambda (y)(* y y)) y))) 
= 
(let ([y 3]) 
    (let ([x ((lambda (y)(* y y)) y)])  ; by application 
    y)) 
= 
(let ([y 3]) 
    (let ([x ((lambda (z)(* z z)) y)])  ; by alpha-renaming 
    y)) 
= 
(let ([y 3]) 
    (let ([x (let ([z y])    ; by application 
       (* z z))]) 
    y)) 
= 
(let ([y 3]) 
    (let ([x (* y y)])    ; by let-elimination 
    y)) 
= 
(let ([y 3]) 
    (let ([x 9])      ; by expression evaluation 
    y)) 
= 
(let ([y 3]) 
    y )      ; by let-elimination 
= 
3        ; by let-elimination 

Wie Sie sehen können, die verschachtelten (lambda (y)(* y y)) in einem verschachtelten Bereich befindet, nicht die y beeinflussen, die schließlich zurückgeführt wird, sondern nur x, welcher Wert, , wird ausgewertet und dann verworfen.