评估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))
但如何评估呢?
答案 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
是
请参阅?内部lambda作为值返回,作为将外部lambda应用于参数5和6的结果。新值在其定义环境中封闭,其中{ {1}}和y=6
- 此类lambda也称为 closure :
然后将其应用于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