I\'ve spent a day reading page 166\'s length≤1
in the book The Little Schemer; there\'s the following code:
(((lambda (mk-length)
Suppose l
is (apples oranges)
, then it will evaluate like this (note that mk-length
is bound to the the (lambda (mk-length) ...)
function itself:
(cond ((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))
==>
(add1 ((mk-length eternity) '(oranges)))
==>
(add1 ((lambda (l) (cond ((null? l) 0
(else (add1 ((eternity eternity) (cdr l))))))))
==>
(add1 (add1 ((eternity eternity) '())))
So here, after two steps, eternity
ends up being applied, but what we want is for it to call mk-length
. So in the original function, if we replace eternity
by mk-length
, then the last step I wrote will contain (mk-length mk-length)
instead of (eternity eternity)
, allowing the computation to proceed.