【发布时间】:2011-01-04 20:50:02
【问题描述】:
在阅读“经验丰富的计划者”时,我开始了解letrec。我理解它的作用(可以用 Y-Combinator 复制),但本书使用它来代替已经在保持静态的参数上运行的 defined 函数。
一个使用 defined 函数的旧函数的示例在自身上重复出现(没什么特别的):
(define (substitute new old l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (substitute new old (cdr l))))
(else
(cons (car l) (substitute new old (cdr l))))))
现在以使用 letrec 的相同函数为例:
(define (substitute new old l)
(letrec
((replace
(lambda (l)
(cond
((null? l) '())
((eq? (car l) old)
(cons new (replace (cdr l))))
(else
(cons (car l) (replace (cdr l))))))))
(replace lat)))
除了略长且更难阅读之外,我不知道他们为什么要重写书中的函数以使用 letrec。以这种方式重复静态变量时是否会提高速度,因为您不会一直传递它??
对于参数保持静态但一个参数减少的函数(例如向下循环列表的元素),这是标准做法吗?
来自更有经验的 Schemers/LISPers 的一些意见会有所帮助!
【问题讨论】:
标签: functional-programming lisp scheme racket letrec