这是我正在阅读的书中的一个例子:
1 (define (length items)
2 (define (length-iter a count)
3 (if (null? a)
4 count
5 (length-iter (cdr a)(+ 1 count))))
6 (length-iter items 0))
我不理解的是length-iter
如何知道伯爵?这是第一次
使用list
调用过程,它将依次定义另一个带有两个参数的过程,我得到了那么多。但是,它如何知道a
是list items
?它尚未到达第6行,其中items
作为参数length-iter
传递给a
。不知怎的,虽然它已经知道这个并且能够进行计算。任何帮助澄清这一点是值得赞赏的!
答案 0 :(得分:4)
length
功能分为两部分:
length-iter
; 的length-iter
的调用。在调用中,即第6行,您将原始items
列表作为参数传递给内部函数。这是内部函数被调用的地方。以前,您只是定义函数,而不是调用它:
(length-iter items 0)
因此,items
将绑定到a
,0
绑定到count
。您可以将内部函数视为一个单独的函数:
(define (length-iter a count)
(if (null? a)
count
(length-iter (cdr a)(+ 1 count))))
然后,将length
函数视为仅将所有工作委托给length-iter
函数:
(define (length items)
(length-iter items 0))
这就是你的功能所做的。不同之处在于length-iter
功能仅为length
所知。