你的程序就相當於
(let ((f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))))
(let ((e (lambda (x) (* x 3))))
(let ((d (f e)))
(d 4))))
一般情況下,應letrec
一直在使用,不let
,但在這裏它沒有什麼區別。 letrec
允許程序在其主體內引用其自己的名稱,即,遞歸。 let
不允許這樣的參考。例如,定義f
的lambda表達式不包含對f
的任何引用。
現在通過試圖找出d
的值來進行評估,將其用作值爲4
的參數調用的函數。因此執行應用程序(f e)
。一般而言,應用程序((lambda (x) ...) v)
被減小(let ((x v)) ...)
:返回
(let ((f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))))
(let ((e (lambda (x) (* x 3))))
(let ((d (let ((g e)) ; <---
(lambda (x) (g (+ (g x) (g x)))))
))
(d 4))))
的封閉:
(let ((f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))))
(let ((e (lambda (x) (* x 3))))
(let ((g e))
(let ((d (lambda (x) (g (+ (g x) (g x))))))
(d 4))))) ; <---
現在d
的值被發現是一個程序,從而執行該應用程序(d 4)
:
(let ((f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))))
(let ((e (lambda (x) (* x 3))))
(let ((g e))
(let ((d (lambda (x) (g (+ (g x) (g x))))))
(let ((x 4))
(g (+ (g x) (g x)))))))) ; <---
(let ((f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))))
(let ((e (lambda (x) (* x 3))))
(let ((g e))
(let ((d (lambda (x) (g (+ (g x) (g x))))))
(let ((x 4))
(let ((temp1 (+ (g x) (g x)))) ; <---
(g temp1)))))))
這就是
......
(let ((x 4))
(let ((temp2 (g x)) ; <---
(temp3 (g x)))
(let ((temp1 (+ temp2 temp3)))
(g temp1))))))))
......
(let ((x 4))
(let ((temp2 ((lambda (x1) (* x1 3)) x)) ; <---
(temp3 (g x)))
(let ((temp1 (+ temp2 temp3)))
(g temp1))))))))
......
(let ((x 4))
(let ((temp2 (let (x1 x) (* x1 3))) ; <---
(temp3 (g x)))
(let ((temp1 (+ temp2 temp3)))
(g temp1))))))))
......
(let ((x 4))
(let ((temp2 (let (x1 4) (* x1 3))) ; <---
(temp3 (g x)))
(let ((temp1 (+ temp2 temp3)))
(g temp1))))))))
......
(let ((x 4))
(let ((temp2 (* 4 3)) ; <---
(temp3 (g x)))
(let ((temp1 (+ temp2 temp3)))
(g temp1))))))))
等。這不是計劃實際運作的方式,而是接近。最後,我們到達
......
(let ((x 4))
(let ((temp2 12)
(temp3 12))
(let ((temp1 24))
(g temp1)))))))) ; <---
......
(let ((temp1 24))
((lambda (x2) (* x2 3)) temp1)))))) ; <---
......
(let (x2 24) (* x2 3)))))) ; <---
......
(* 24 3) )))) ; <---
......
72 )))) ; []
'(define d(fe))'定義'd'來保存評估結果值(fe)',它調用'f'所指的函數,其值爲作爲論點。 –