【发布时间】:2012-01-29 14:13:42
【问题描述】:
Kent Dybvig 在 The Scheme Programming Language 中为 letrec 和 letrec* 提供的两个示例是:
(letrec ([sum (lambda (x)
(if (zero? x)
0
(+ x (sum (- x 1)))))])
(sum 5))
和
(letrec* ([sum (lambda (x)
(if (zero? x)
0
(+ x (sum (- x 1)))))]
[f (lambda () (cons n n-sum))]
[n 15]
[n-sum (sum n)])
(f))
第一个也可以写成命名的let:
(let sum ([x 5])
((lambda (x)
(if (zero? x)
0
(+ x (sum (- x 1))))) x))
第二个可以写成带有内部定义的 let:
(let ()
(define sum (lambda (x)
(if (zero? x)
0
(+ x (sum (- x 1))))))
(define f (lambda () (cons n n-sum)))
(define n 15)
(define n-sum (sum n))
(f))
letrec/letrec* 形式似乎并不比命名的 let 或带有内部定义形式的 let 更简洁或更清晰。
谁能给我看一个例子,其中 letrec/letrec* 确实改进了代码或者是必要的,而不是使用内部定义命名的 let 或 let。
【问题讨论】:
标签: scheme