使用lambda代替let-in方案
在SICP 1.2.1中,有一个生成有理数的函数,如下所示:使用lambda代替let-in方案,lambda,scheme,sicp,Lambda,Scheme,Sicp,在SICP 1.2.1中,有一个生成有理数的函数,如下所示: (define (make-rat n d) (let ((g (gcd n d))) (cons (/ n g) (/ d g)))) 我只是想知道,如何使用lambda而不是let实现同样的事情,而不必调用GCD两次。我自己想不出来。这两件事是一样的: ((lambda (p1 p2...) body) v1 v2...) 及 看, 应该相当于 (define (make-rat n d) ((lambda (
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
我只是想知道,如何使用lambda而不是let实现同样的事情,而不必调用GCD两次。我自己想不出来。这两件事是一样的:
((lambda (p1 p2...) body) v1 v2...)
及
看,
应该相当于
(define (make-rat n d)
((lambda (g)
(cons (/ n g) (/ d g)))
(gcd n d)))
让我们检查两个简单的案例,以便了解如何重写使用Let和lambda的任何函数:
(define (test x)
(let ((b 10))
(+ x b)))
(define (test-lambda x)
((lambda (b)
(+ x b))
10))
如您所见,testlambda返回一个lambda计算值,该值用值10进行计算。对此,我们可以说:
(test-lambda 10)
它将返回20
(define (lets x)
(let ((a 10)
(b 20))
(+ x a b)))
我们可以用lambda这样写:
(define (lets-lambda x)
((lambda (a)
((lambda (b)
(+ x a b))
20))
10))
现在我们计算每个lambda表达式,给它们一个值,最里面的lambda表达式负责使用每个lambda表达式分配的变量名计算什么
希望这是清楚的,可以帮助其他人看得更清楚
(define (test x)
(let ((b 10))
(+ x b)))
(define (test-lambda x)
((lambda (b)
(+ x b))
10))
(test-lambda 10)
(define (lets x)
(let ((a 10)
(b 20))
(+ x a b)))
(define (lets-lambda x)
((lambda (a)
((lambda (b)
(+ x a b))
20))
10))