【问题标题】:letrec in scheme with double brackets?带有双括号的方案中的letrec?
【发布时间】:2015-02-11 22:29:14
【问题描述】:

我无法理解ribbon01 代码,与括号混淆。有人可以向我解释一下吗?我是新来的计划

(define ribbon01
  (lambda (lat)
    ((letrec
         ((di (lambda (lat)
                (display lat))))
       di) (cdr lat))))

(define ribbon02
  (lambda (lat)
    (letrec (( di (lambda (lat)
                  (display lat))))
    (di (cdr lat)))))

ribbon02 很容易理解,letrec 中有 2 条语句,声明 di 和调用 di。

【问题讨论】:

    标签: scheme


    【解决方案1】:

    注意(1)中的双括号和(2)中的返回值:

    (define ribbon01
      (lambda (lat)
        ((letrec ; (1)
             ((di (lambda (lat)
                    (display lat))))
           di)   ; (2)
         (cdr lat))))
    

    发生的事情是我们在 (2) 中返回 di,然后我们在 (1) 中应用它作为参数传递 (cdr lat) - 请记住,一对 () 应用作为函数传递的值,在这种情况下,该值是di。与ribbon02相同,只是ribbon01中的函数应用发生在letrec之外

    【讨论】:

      【解决方案2】:

      将表达式包含在额外括号中的唯一原因是如果您想将其作为过程应用。

      (define ribbon01
        (lambda (lat)
          ((letrec ((di (lambda (lat)
                          (display lat))))
             di)
           (cdr lat))))
      

      现在letrec 中的唯一变量是di,它是一个参数的过程。然后在letrec 的主体中对di 求值,因此整个letrec 的结果是一个过程。由于 di 没有在 lambda 中使用,我们可以使用 lambda 形式简化整个 letrec

      (define ribbon01
        (lambda (lat)
          ((lambda (lat) (display lat)) (cdr lat))))
      

      现在 lambda 只使用一个参数并提供 display。我们也可以替换它:

      (define ribbon01
        (lambda (lat)
          (display (cdr lat))))
      

      因此,如果您想象您评估(ribbon01 '(1 2 3 4)),您知道cdr 将等于(2 3 4),这就是显示的内容。

      ribbon02 不会返回该过程然后调用它,而是从letrec 中应用它。这可能是使用letrec 的一种更常见的方式,但结果是一样的。再次将 di 替换为它所代表的内容:

      (define ribbon02
        (lambda (lat)
          ((lambda (lat) (display lat)) (cdr lat))))
      

      你会发现你和ribbon01在同一个地方,并且可以从那里做同样的减少。

      因此,如果您有一个表达式e 并在其周围加上括号(e something),您就知道表达式e 需要评估为一个过程,并且某些东西将成为它的一个参数。

      它与(+ 1 2) 没有什么不同,因为+ 也是一个成为过程的表达式,并且由于它周围有额外的括号,因此它的应用与您的letrec 一样。没有什么不同。

      【讨论】:

      • 感谢您的回答。我实际上在将其发布在此论坛上之前简化了该功能。再次感谢您的宝贵时间
      猜你喜欢
      • 2019-07-02
      • 2017-10-09
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2012-11-12
      相关资源
      最近更新 更多