题
在SICP 1.2.1中,有一个函数可以使合理数字构成:如下:
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
我只是好奇您如何使用lambda而不是让labda实现同一件事,而无需两次致电GCD。我自己无法弄清楚。
解决方案
看着 SICP第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)))
其他提示
这两件事是相同的:
((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)))
让我们检查两个简单的案例,以便我们可以理解如何重写使用Lambda的任何功能:
在我们的第一种情况下,我们有一个。此功能非常简单,它通过向其添加10个返回给定输入:
(define (test x) (let ((b 10)) (+ x b)))
现在,让我们使用lambda将其转变为表达式:
(define (test-lambda x)
((lambda (b)
(+ x b))
10))
如您所见,Test-Lambda返回使用值10进行评估的lambda评估。对此我们可以说:
(test-lambda 10)
将返回20。
- 现在,对于多个LET,我们将lambda表达在lambda-exptressions中嵌套。
我们的案例我们有两个让陈述:
(define (lets x)
(let ((a 10)
(b 20))
(+ x a b)))
我们可以像这样写这句话:
(define (lets-lambda x)
((lambda (a)
((lambda (b)
(+ x a b))
20))
10))
因此,现在我们正在评估每种lambda表达式,从而使它们具有值,而最内向的lambda表达式会使用每个lambda表达式所分配的变量名称来计算我们要计算的内容。
希望这很清楚,可以帮助其他人更清楚地看到!
不隶属于 StackOverflow