Scheme 小阴谋家:length0和mk length
小阴谋家给出了下面的函数长度0。但是这是如何工作的呢?看起来长度lambda正在传递给mk length lambda,它使用作为参数传递的长度lambda本身来计算长度lambda。因此,当底部的Scheme 小阴谋家:length0和mk length,scheme,the-little-schemer,Scheme,The Little Schemer,小阴谋家给出了下面的函数长度0。但是这是如何工作的呢?看起来长度lambda正在传递给mk length lambda,它使用作为参数传递的长度lambda本身来计算长度lambda。因此,当底部的(length(cdrl))被计算时length就是lambda本身的长度。但是长度lambda采用两个参数:length和l。那么(长度(cdrl))又有什么意义呢 ((lambda (mk-length) (mk-length mk-length)) (lambda (length)
(length(cdrl))
被计算时length
就是lambda本身的长度。但是长度lambda采用两个参数:length
和l
。那么(长度(cdrl))
又有什么意义呢
((lambda (mk-length)
(mk-length mk-length))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
(length (cdr l))))))))
这个小阴谋家正在构建一个函数,它可以处理越来越长的列表。长度点的一部分≤0表示它只适用于长度小于或等于零的列表(因为没有长度为负的列表,这意味着长度为零的列表)。您故意显示的代码仅适用于长度为零的列表。事实上,这一点甚至在关于:
A:如果我们现在可以创建另一个mk长度的应用程序到永恒呢?B:那只会把问题推迟到一个,而且,我们怎么能这样做呢?
A:既然没人关心我们传递给mk length的函数是什么,我们可以先传递给它mk length。
B:这个主意不错。然后我们在永恒上调用mk length,并在cdr上调用结果,这样我们就可以得到塔的另一部分。
A:那么这仍然是长度0 B:是的,我们甚至可以使用mk长度而不是长度: A:我们为什么要这样做?
B:所有名称都相等,但有些名称比其他名称更相等。
A:True:只要我们始终如一地使用这些名称,我们就很好。
B:而mk length是一个远比length平等的名称。如果我们使用像mk length这样的名称,它会不断提醒我们mk length的第一个参数是mk length 在上,作者展示了一个适用于长度为0或1的列表的版本(即。,≤1). 最后,他们得到了一个适用于任意长度列表的版本。另一个问题更详细地描述了其工作原理:
- (涉及第166页长度上使用的
功能≤(一)永恒
(lambda(l)…
返回到add1
,从而导致错误;这就是为什么它是length\u 0
:它只适用于空列表。而且名称length
也错了,它实际上应该被称为mk length
——实际上,在该帧的右半部分。
((lambda (mk-length)
(mk-length mk-length))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
(length (cdr l))))))))
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
(mk-length (cdr l))))))))