use*_*220 3 scheme the-little-schemer
小计划器在第165页上给出了以下内容,因为函数长度为0.但这是如何工作的?看起来长度lambda被传递给mk-length lambda,它估计长度为lambda,长度为lambda本身作为参数传递.那么,当(length (cdr l))评估底部时,length只是λ本身的长度.但长度lambda有两个参数curry:length和l.那么怎么(length (cdr l))才有意义呢?
((lambda (mk-length)
(mk-length mk-length))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
(length (cdr l))))))))
Run Code Online (Sandbox Code Playgroud)
Little Schemer正在构建一个适用于越来越长的列表的函数.长度≤0的部分点是它仅适用于长度小于或等于零的列表(并且由于没有负长度列表,这意味着长度为零的列表).您有意展示的代码仅适用于长度为零的列表.实际上,第165页的文本中甚至指出了这一点:
答:如果我们此时可以创建另一个mk-length应用程序到永恒怎么办?
B:那只会把问题推迟到一个,而且,我们怎么能这样做呢?
答:好吧,因为没有人关心我们传递给mk-length的函数,我们最初可以传递mk-length.
B:这是正确的想法.然后我们在永恒上调用mk-length,并在cdr上调用它的结果,这样我们就可以再获得一块塔.答:然后,这是仍然长度0
Run Code Online (Sandbox Code Playgroud)((lambda (mk-length) (mk-length mk-length)) (lambda (length) (lambda (l) (cond ((null? l) 0) (else (add1 (length (cdr l))))))))B:是的,我们甚至可以使用mk-length而不是length:
Run Code Online (Sandbox Code Playgroud)((lambda (mk-length) (mk-length mk-length)) (lambda (mk-length) (lambda (l) (cond ((null? l) 0) (else (add1 (mk-length (cdr l))))))))A:我们为什么要这样做?
B:所有名字都相同,但有些名字比其他名字更平等.
答:是的:只要我们始终使用这些名称,我们就可以了.
B:与MK-长度是一个更为平等的名字比长度.如果我们使用类似mk-length的名称,则不断提醒mk-length的第一个参数是mk-length.
在页166,作者显示适用于长度为0或1(即≤1)的列表的版本.最后,在页167,他们到达一个适用于任何长度列表的版本.如何是在另外一个问题更详细的描述工作原理:
您可能还会发现以下感兴趣的问题:
eternity在第166页的使用功能长度≤1)