传递过程执行的说明

时间:2014-06-09 16:56:29

标签: lambda scheme lisp sicp

在SICP讲座2a中,我对(average (f x) x)感到困惑。它不仅仅是(average f x)f是不是lambda已经代表(/ x y)了?为什么我需要(average (f x) x)?有人可以用替换方法帮我解决这个问题吗?

(define (sqrt x)
    (fixed-point
        (average-damp (λ (y) (/ x y)))
        1))

(define average-damp
    (λ (f)
        (λ (x) (average (f x) x))))

1 个答案:

答案 0 :(得分:2)

此片段:

(average (f x) x)

意味着与此不同的是:

(average (f) x)

对于初学者,f是一个函数,它需要一个参数,在这种情况下必须是x,因此我们说(f x)。如果您写(f),则尝试在没有参数的情况下调用f,从而导致错误。在使用average-damp参数的值调用它后用f替换,我们发现它返回另一个 lambda,这是:

(λ (x)
  (average ((λ (y) (/ x y)) x) x))

正如您所看到的,在此表达式((λ (y) (/ x y)) x)中,x作为参数传递给(λ (y) (/ x y)) x)f},x绑定到y参数。不要混淆!因为现在我们有:

(/ x x)

但此时的第一个x不是变量,它是调用sqrt时在闭包中捕获的,而第二个x是我们刚刚返回的lambda中的参数,并且在调用它之前仍然未绑定,可能是fixed-point