【问题标题】:scheme - function with let方案 - 使用 let 的函数
【发布时间】:2011-04-23 15:18:08
【问题描述】:

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

这里有两个函数:

(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),返回值为0。然后,我们将再次使用(foo (foo 0)) => (foo 0) 输入函数foo。我们再次输入函数goo2 将打印出来。但是当我运行它时,2 只打印一次。我想我错过了一个关于let 及其与lambda 的联系的关键问题。

【问题讨论】:

    标签: scheme


    【解决方案1】:

    foo 定义中的let,因此gooa 的应用,是在定义foo 时评估的,而不是在评估foo 时。

    这样看:foo 的值是多少?它是lambda 表达式。 f 的绑定被 foo 关闭,每次评估 foo 时都不会“重做”。

    编辑:这是一个没有lambdas 的示例

    > (let ((x (sqrt 2))) (* x 3))
    4.24264068711929
    > (define bar (let ((x (sqrt 2))) (* x 3)))
    > bar
    4.24264068711929
    >        
    

    当您评估bar 时,您不会再次调用sqrtbar 被定义为let 的主体,在这种情况下,一个数字是表达式的结果。

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

    【讨论】:

    • 坦克你。但是“let”的主体是: (lambda (x) (if (= x 0) x (f x))) 意思——我每次评估“foo”时都必须输入 let。因为那样,我也输入了函数“goo”(重新定义)。我缺少什么?
    • 当 x 不为零时,您再次计算 f;但是 f 是定义 foo 时评估 (goo a) 的结果; f 已经绑定了,每次执行 foo 都不会反弹。
    猜你喜欢
    • 2012-06-05
    • 2020-01-19
    • 2012-11-21
    • 2015-11-17
    • 1970-01-01
    • 2011-12-23
    • 2013-05-07
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多