【发布时间】:2012-06-14 16:06:44
【问题描述】:
我一直在阅读 The Seasoned Schemer 并且遇到了 length 函数的这个定义
(define length
(let ((h (lambda (l) 0)))
(set! h (L (lambda (arg) (h arg))))
h))
后来他们说:
(L (lambda (arg) (h arg))) 的值是多少?就是函数
(lambda (l)
(cond ((null? l) 0)
(else (add1 ((lambda (arg) (h arg)) (cdr l))))))
我认为我没有完全理解这一点。我想我们应该将L自己定义为一种练习。我使用 letrec 在 length 的定义中编写了 L 的定义。这是我写的:
(define length
(let ((h (lambda (l) 0)))
(letrec ((L
(lambda (f)
(letrec ((LR
(lambda (l)
(cond ((null? l) 0)
(else
(+ 1 (LR (cdr l))))))))
LR))))
(set! h (L (lambda (arg) (h arg))))
h)))
因此,L 将一个函数作为其参数,并将另一个函数作为值返回,该函数将一个列表作为其参数并在列表上执行递归。我的解释是正确的还是完全错误的?无论如何,定义有效
(length (list 1 2 3 4)) => 4
【问题讨论】: