在SICP 1.2.1有一個函數,使一個合理的數字,如下:使用lambda,而不是讓方案
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
我只是好奇,你怎麼可以使用lambda,而不是實現同樣的事情讓,而不是兩次打電話給GCD。我自己弄不明白。
在SICP 1.2.1有一個函數,使一個合理的數字,如下:使用lambda,而不是讓方案
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
我只是好奇,你怎麼可以使用lambda,而不是實現同樣的事情讓,而不是兩次打電話給GCD。我自己弄不明白。
(let ((<var1> <exp1>)
(<var2> <exp2>)
...
(<varn> <expn>))
<body>)
相當於
((lambda (<var1> ...<varn>)
<body>)
<exp1>
...
<expn>)
所以你的程序,
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
應相當於
(define (make-rat n d)
((lambda (g)
(cons (/ n g) (/ d g)))
(gcd n d)))
這兩件事情都是一樣的:
((lambda (p1 p2...) body) v1 v2...)
和
(let ((p1 v1) (p2 v2)...) body)
(define-syntax let-as-lambda
(syntax-rules()
((_ (x value) body)
(let ((x value))
body))))
(printf "~s~n" (let-as-lambda (x 1) (+ x 1)))
讓我們來看看兩個簡單的情況下,使我們可以瞭解我們如何可以重寫使用與拉姆達讓任何功能:
在我們的第一個案例中,我們有一個let。這個功能很簡單,它通過增加10返回給定輸入:
(define (test x)
(let ((b 10))
(+ x b)))
現在讓我們使用lambda把它變成一種表達:
(define (test-lambda x)
((lambda (b)
(+ x b))
10))
正如你所看到的, test-lambda返回一個lambda評估,評估值爲10.測試這個我們可以這樣說:
(test-lambda 10)
這將返回20.
我們的讓利情況下,我們有兩個讓語句:所以現在我們正在評估每個lambda表達式給他們
(define (lets-lambda x)
((lambda (a)
((lambda (b)
(+ x a b))
20))
10))
:
(define (lets x)
(let ((a 10)
(b 20))
(+ x a b)))
我們可以拉姆達像這樣寫一個值,最內層的lambda表達式使用每個lambda表達式分配的變量名稱來處理我們想要計算的內容。
希望這是清楚的,並可能幫助其他人看得更清楚!