代码之家  ›  专栏  ›  技术社区  ›  MastRofDsastR

使用lambdas解释该方案程序的评估

  •  0
  • MastRofDsastR  · 技术社区  · 7 年前

    我想知道下面的代码如何计算为3。

    (define (foo y) ((lambda (x) y) ((lambda (y)(* y y)) y))) 
    
    (foo 3)
    

    我已经看了一段时间了,似乎无法理解为什么评估没有得到9。有人能提供一个详细的分步说明,如何评估为3?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Óscar López    7 年前

    让我们从更容易理解的方式缩进代码开始:

    (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 参数,该参数为 3. 一直以来:

    => 3
    
        2
  •  1
  •   Will Ness Derri Leahy    7 年前

    具有 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 最终返回,但只有 x 9 ,然后将其丢弃。