scheme - 带let的函数

时间:2011-04-23 15:18:08

标签: scheme

我之前看到过一个类似的问题,但我不明白这里的另一个问题。

这是两个功能:

(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的关联的关键问题。

1 个答案:

答案 0 :(得分:2)

let定义中的foo,以及gooa的应用,在定义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 > 时,您没有再次致电barsqrt被定义为bar的主体,在这种情况下是一个数字,如果是表达式则是结果。

在您的示例中,let的正文是let表达式。但就像我的例子一样,lambda绑定不会被重新执行。