我想知道以下代码如何评估为3.
\Excel::create('all_users_records', function ($excel) use ($format) {
$excel->sheet('Epay.Li - all users report', function ($sheet) use ($format) {
$all_records = ChangeMoney::all();
$sheet->loadView('layouts.admin.all_users_report',
array(
'all_records' => $all_records,
)
);
});
})->export($format);
我已经看了一段时间,似乎无法理解为什么评估不会导致9.有人可以提供详细的逐步说明,如何评估为3?
答案 0 :(得分:3)
让我们首先以一种易于理解的方式缩进代码:
(define (foo y)
((lambda (x) y)
((lambda (y) (* y y))
y)))
现在让我们从内到外评估它:
(define (foo y)
((lambda (x) y)
((lambda (y) (* y y))
3))) ; pass the parameter
(define (foo y)
((lambda (x) y)
(* 3 3))) ; evaluate innermost lambda
(define (foo y)
((lambda (x) y) 9)) ; pass the result of evaluation
啊哈!我们得到3
的地方。即使我们将9
作为参数传递(绑定到x
),我们也只是返回最外层y
参数的值,即{{1一直以来:
3
答案 1 :(得分:1)
重写Item<TItem> item = new Item<Item<TItem>>();
,
let
如您所见,嵌套(define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y)))
(foo 3)
=
(let ([y 3]) ; by application
((lambda (x) y) ((lambda (y)(* y y)) y)))
=
(let ([y 3])
(let ([x ((lambda (y)(* y y)) y)]) ; by application
y ))
=
(let ([y 3])
(let ([x ((lambda (z)(* z z)) y)]) ; by alpha-renaming
y ))
=
(let ([y 3])
(let ([x (let ([z y]) ; by application
(* z z))])
y ))
=
(let ([y 3])
(let ([x (* y y)]) ; by let-elimination
y ))
=
(let ([y 3])
(let ([x 9]) ; by expression evaluation
y ))
=
(let ([y 3])
y ) ; by let-elimination
=
3 ; by let-elimination
位于嵌套范围内,不会影响最终返回的(lambda (y)(* y y))
,而只影响y
,其值为 9 ,进行评估然后丢弃。