(define length-it
(lambda (ls)
(length ls 0)))
(define length
(lambda (ls acc)
(if (null? ls)
acc
(length (cdr ls) (+ acc 1)))))
如何使用letrec
将函数放入函数length
体内length-it
?
输出应该是(length-it '(1 2 3))
-> 3
。
让我们从我们所拥有的开始:
(define length-it
(lambda (ls)
(length ls 0)))
但实际上,由于还调用了一个内置函数length
,所以让我们将我们的函数重命名为my-length
:
(define my-length
(lambda (ls acc)
(if (null? ls)
acc
(my-length (cdr ls) (+ acc 1)))))
现在,
(define length-it
(lambda (ls)
(my-length ls 0)))
=
(define length-it
(let ((init 0))
(lambda (ls)
(my-length ls 0)))) ;; (0)
=
(define length-it
(let ((init 0)) ;; (1)
(lambda (ls)
(my-length ls init)))) ;; (2)
这行得通吗?指的是什么实体init(2)
?是init(1)
吗?
下一个,
=
(define length-it
(let ((init 0) ;; (0)
(my-length ;; (1)
(lambda (ls acc)
(if (null? ls)
acc
(my-length (cdr ls) (+ acc 1)))))) ;; (2)
(lambda (ls)
(my-length ls init)))) ;; (3)
现在这行得通吗?(一定要在一个新的、新鲜的环境中测试这个,根本没有单独定义)。 my-length
不?为什么不?
该名称指的是什么实体init(3)
?指的是什么my-length(3)
?这个名字my-length(2)
指的是什么?如果按原样my-length(2)
引用它会起作用吗?既然它不起作用,必须参考上面定义的其他一些东西,但是我们那里还有更多的东西吗?my-length(1)
my-length(3)
my-length(2)
my-length
let
那你能让它工作吗?你应该在let
那里使用,还是其他原语letrec
?两者完全一样吗?可能不是,否则他们为什么要两次命名同一个东西?那么我们可以尝试在那里使用另一个吗?它会不会确实像它应该做的那样my-length(2)
引用?my-length(1)
它现在有效吗?