使用lambdas对此Scheme过程的评估说明

时间:2017-10-18 23:06:43

标签: scope scheme racket evaluation r5rs

我想知道以下代码如何评估为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?

2 个答案:

答案 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 ,进行评估然后丢弃。