Как сделать это length≤1 более одного раза?
Я провел день, читая страницу 166 length≤1
в книге "Маленький интриган"; есть следующий код:
(((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
((mk-length eternity)
(cdr l))))))))
l)
где l
является (apples)
а также eternity
как следует:
(define eternity
(lambda (x)
(eternity x)))
Страница 166 (4-е изд.) Утверждает, что:
Когда мы подаем заявку
mk-length
однажды мы получаемlength≤1
А потом
Можем ли мы сделать это более одного раза?
Но я не знаю, как это сделать для получения length≤2
?
1 ответ
Предполагать l
является (apples oranges)
то будет оцениваться вот так (обратите внимание, что mk-length
связан с (lambda (mk-length) ...)
сама функция:
(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) '())))
Так вот, после двух шагов, eternity
в конечном итоге применяется, но мы хотим, чтобы это называется mk-length
, Так что в оригинальной функции, если мы заменим eternity
от mk-length
, тогда последний шаг, который я написал, будет содержать (mk-length mk-length)
вместо (eternity eternity)
, позволяя продолжить вычисление.