Little Schemer:length0和mk-length

use*_*220 3 scheme the-little-schemer

小计划器在第165页上给出了以下内容,因为函数长度为0.但这是如何工作的?看起来长度lambda被传递给mk-length lambda,它估计长度为lambda,长度为lambda本身作为参数传递.那么,当(length (cdr l))评估底部时,length只是λ本身的长度.但长度lambda有两个参数curry:lengthl.那么怎么(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)

Jos*_*lor 5

Little Schemer正在构建一个适用于越来越长的列表的函数.长度≤0的部分点是它仅适用于长度小于或等于零的列表(并且由于没有负长度列表,这意味着长度为零的列表).您有意展示的代码仅适用于长度为零的列表.实际上,第165页的文本中甚至指出了这一点:

答:如果我们此时可以创建另一个mk-length应用程序到永恒怎么办?
B:那只会把问题推迟到一个,而且,我们怎么能这样做呢?
答:好吧,因为没有人关心我们传递给mk-length的函数,我们最初可以传递mk-length.
B:这是正确的想法.然后我们在永恒上调用mk-length,并在cdr上调用它的结果,这样我们就可以再获得一块塔.答:然后,这是仍然长度0

((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)

B:是的,我们甚至可以使用mk-length而不是length:

((lambda (mk-length)
   (mk-length mk-length))
 (lambda (mk-length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else (add1
                (mk-length (cdr l))))))))
Run Code Online (Sandbox Code Playgroud)

A:我们为什么要这样做?
B:所有名字都相同,但有些名字比其他名字更平等.
答:是的:只要我们始终使用这些名称,我们就可以了.
B:MK-长度是一个更为平等的名字比长度.如果我们使用类似mk-length的名称,则不断提醒mk-length的第一个参数是mk-length.

页166,作者显示适用于长度为0或1(即≤1)的列表的版本.最后,在页167,他们到达一个适用于任何长度列表的版本.如何在另外一个问题更详细的描述工作原理:

您可能还会发现以下感兴趣的问题: