Как сделать это 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), позволяя продолжить вычисление.

Другие вопросы по тегам