在方案中使用 lambda 而不是 let
在 SICP 1.2.1 中,有一个生成有理数的函数,如下所示:
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
我只是好奇如何使用 lambda 而不是 let 来实现相同的功能,而无需调用 GCD 两次。我自己也想不通。
In SICP 1.2.1 there is a function that makes a rational number, as follow:
(define (make-rat n d)
(let ((g (gcd n d)))
(cons (/ n g) (/ d g))))
I'm just curious how you can implement the same thing using lambda instead of let, without calling GCD twice. I couldn't figure it out myself.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
查看 SICP 第 1.3.2 节,
相当于
所以你的程序,
应该相当于
Looking at SICP section 1.3.2,
is equivalent to
So your procedure,
should be equivalent to
这两件事是相同的:
和
These two things are same:
and
让我们检查两个简单的案例,以便我们能够理解如何重写任何使用 let 和 lambda 的函数:
在第一个案例中,我们有一个 let。这个函数非常简单,它通过添加 10 来返回给定的输入:
<前><代码>(定义(测试x)
(让((b 10))
(+xb)))
现在让我们使用 lambda 将其转换为表达式:
正如您所看到的,test-lambda 返回一个 lambda 计算,该计算使用值 10 进行计算。 测试这个我们可以说:
这将返回 20。
我们的 let 案例有两个 let 语句:
我们可以像这样用 lambda 来编写它:
所以现在我们正在计算每个 lambda 表达式,并给它们一个值,最里面的 lambda 表达式负责使用变量名称计算我们想要计算的内容每个 lambda 表达式都已分配。
希望这很清楚,并可以帮助其他人看得更清楚!
Let us examine two simple cases so that we can understand how we can rewrite any function that uses let with lambda:
In our first case we have one let. This function is very simple, it returns a given input by adding 10 to it:
Now let us turn this into an expression using lambda:
As you can see, test-lambda returns a lambda evaluation that is evaluated with the value 10. Testing this we can say:
which will return 20.
Our let case we have two let statements:
We can write this with lambda like so:
So now we are evaluating each of the lambda expressions giving them a value, and the innermost lambda expression takes care of what we want to compute using the variable names that each lambda expression has been assigned.
Hope this was clear and might help others see more clearly!