将表达式包含在额外括号中的唯一原因是如果您想将其作为过程应用。
(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 一样。没有什么不同。