2010-05-25 34 views
7

在SICP 1.2.1有一個函數,使一個合理的數字,如下:使用lambda,而不是讓方案

(define (make-rat n d) 
    (let ((g (gcd n d))) 
    (cons (/ n g) (/ d g)))) 

我只是好奇,你怎麼可以使用lambda,而不是實現同樣的事情讓,而不是兩次打電話給GCD。我自己弄不明白。

回答

13

看着SICP section 1.3.2

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

這兩件事情都是一樣的:

((lambda (p1 p2...) body) v1 v2...) 

(let ((p1 v1) (p2 v2)...) body) 
1
(define-syntax let-as-lambda 
    (syntax-rules() 
     ((_ (x value) body) 
      (let ((x value)) 
       body)))) 

(printf "~s~n" (let-as-lambda (x 1) (+ x 1))) 
1

讓我們來看看兩個簡單的情況下,使我們可以瞭解我們如何可以重寫使用與拉姆達讓任何功能:

  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.

  1. 現在,對於多個let,我們在lambda表達式中嵌套lambda表達式。

我們的讓利情況下,我們有兩個讓語句:所以現在我們正在評估每個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表達式分配的變量名稱來處理我們想要計算的內容。

希望這是清楚的,並可能幫助其他人看得更清楚!

相關問題