Scheme中的嵌套Lambda?

时间:2016-11-20 03:51:14

标签: lambda nested scheme racket evaluation

  

评估Scheme中的(((lambda(x y) (lambda (x) (* x y))) 5 6) 10)

我不确定如何做到这一点!

((lambda (x y) (+ x x y)) 3 5)

相当简单。这里x = 3,y = 5。

但是这个身体是:(lambda (x) (* x y))) 5 6),参数是10

所以我们分开评估?与(lambda (x) (* x y))) 5 6) = (* 5 y)然后(((lambda(x y) (lambda (x) (* x y))) 5 6) 10) = (((lambda (x y) (* 5 y) 10))

一样

但如何评估呢?

3 个答案:

答案 0 :(得分:2)

如果在内部lambda中重命名参数,则更容易:

(((lambda (x y) (lambda (z) (* z y))) 5 6) 10)

外部lambda应用于5和6:

((lambda (x y) (lambda (z) (* z y))) 5 6)

评估为

(lambda (z) (* z 6))

因为y绑定到6 请注意,从不使用外部lambda(绑定到x)的5

然后应用此功能

((lambda (z) (* z 6)) 10)

产生60

答案 1 :(得分:1)

让我们从(lambda(x y) (lambda (x) (* x y)))开始。这是一个函数表达式,它接受两个参数并返回另一个函数表达式。为方便起见,我将整个表达式称为f

现在考虑(f 5 6)。这将返回另一个lambda (lambda (x) (* x y),其中y绑定到传入的值。但是,内部x参数会影响外部{,1},结果为(f 5 6) = (lambda (x) (* x 6)

从这里开始,我们可以直接评估((lambda (x) (* x 6)) 10)。这产生了60的最终结果。

答案 2 :(得分:1)

(  (  (lambda (x y) 
         (lambda (x) (* x y))
         )
      5 
      6) 
   10)

x=5

enter image description here

请参阅?内部lambda作为返回,作为将外部lambda应用于参数5和6的结果。新值在其定义环境中封闭,其中{ {1}}和y=6 - 此类lambda也称为 closure

enter image description here

然后将其应用于10:

(((lambda (x y) (lambda (x) (* x y))) 5 6) 10)

= ( (let ((x 5)
          (y 6))
       (lambda (x) (* x y)))
    10)

= (let ((x 5)
        (y 6))
     ( (lambda (x) (* x y))
       10))

= (let ((x 5)
        (y 6))
      (let ((x 10))
          (* x y)))

=         (* 10 6)

=         60