这是我正在读的书中的一个例子:
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
。不知何故,尽管它已经知道这一点并能够进行计算。任何帮助澄清这一点,不胜感激!
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
知道。