方案中的嵌套Lambda?

方案中的嵌套Lambda?,lambda,nested,scheme,racket,evaluation,Lambda,Nested,Scheme,Racket,Evaluation,在方案中评估((λ(xy)(λ(x)(*xy)))5 6)10) 我不知道该怎么做 ((lambda (x y) (+ x x y)) 3 5) 这相当简单。这里x=3,y=5 但在这里,主体是:(lambda(x)(*xy)))56,参数是10 那么我们单独评估?在(lambda(x)(*xy)))56=(*5y)中,然后((lambda(xy)(lambda(x)(*xy)))56)10=((lambda(xy)(*5y)10)) 但是如何计算呢?让我们从(lambda(xy)(lambd

在方案中评估
((λ(xy)(λ(x)(*xy)))5 6)10)

我不知道该怎么做

((lambda (x y) (+ x x y)) 3 5)
这相当简单。这里x=3,y=5

但在这里,主体是:
(lambda(x)(*xy)))56
,参数是
10

那么我们单独评估?在
(lambda(x)(*xy)))56=(*5y)
中,然后
((lambda(xy)(lambda(x)(*xy)))56)10=((lambda(xy)(*5y)10))

但是如何计算呢?

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

现在考虑<代码>(F 5 6)< /代码>。它返回另一个lambda,<代码>(lambda(x)(*x y)< /> >,y y绑定到传入的值。但是,内部<代码> x < /代码>参数将外部参数隐藏,因此结果是<代码>(f 5 6)=(lambda(x)(*x 6)< /c> > /p>


从这里,我们可以直接计算
((lambda(x)(*x 6))10)
。这将产生
60

的最终结果。如果重命名内部lambda中的参数,会更容易:

(((lambda (x y) (lambda (z) (* z y))) 5 6) 10)
(((lambda (x y) (lambda (x) (* x y))) 5 6) 10)
外部lambda应用于5和6:

((lambda (x y) (lambda (z) (* z y))) 5 6)
这评估为

(lambda (z) (* z 6))
因为
y
绑定到
6

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

然后应用此函数

((lambda (z) (* z 6)) 10)
这将产生
60

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

请参阅?将外部lambda应用于参数5和6后,内部lambda将作为值返回。新值包含在其定义环境中,其中
x=5
y=6
——此类lambda也称为闭包:

然后将其应用于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

否。10适用于((λ(x y)…)5 6)的结果。请仔细查看括号(或使用可以显示匹配参数的编辑器)。请不要完全更改您的问题。这会使人们花时间编写的答案无效。如果您有新问题,请提出新问题。