我之前看到过一个类似的问题,但我不明白这里的另一个问题。
这是两个功能:
(define x 2)
(define a 2)
(define goo
(lambda (x)
(display x)
(lambda (y) (/ x y))))
(define foo
(let ((f (goo a)))
(lambda (x)
(if (= x 0)
x
(f x)))))
(foo (foo 0))
的返回值是多少?什么会打印到屏幕上?
据我了解,当我在开始时运行(foo 0)
时,2
将打印出来(我们将输入函数goo
),返回值将为{{1 }}。然后,我们将使用0
=>再次输入函数foo
(foo (foo 0))
。我们再次输入函数(foo 0)
,goo
将打印出来。但是当我运行它时,2
只打印一次。我想我错过了关于2
及其与let
的关联的关键问题。
答案 0 :(得分:2)
let
定义中的foo
,以及goo
到a
的应用,在定义foo
时进行评估,而不是{评估{1}}。
这样看:foo的价值是什么?它是foo
表达式。 lambda
的绑定由f
关闭,每次评估foo
时都不会“重做”。
编辑:这是一个没有foo
s
lambda
评估> (let ((x (sqrt 2))) (* x 3))
4.24264068711929
> (define bar (let ((x (sqrt 2))) (* x 3)))
> bar
4.24264068711929
>
时,您没有再次致电bar
。 sqrt
被定义为bar
的主体,在这种情况下是一个数字,如果是表达式则是结果。
在您的示例中,let
的正文是let
表达式。但就像我的例子一样,lambda
绑定不会被重新执行。