Опытный интриган: Intersectall (стр. 49)

На странице 49 "Закаленного мошенника" я не могу понять, что происходит в следующем коде (строки 14–16):

(define intersectall
  (lambda (lset)
    (letcc hop
      (letrec
        ((A (lambda (lset)
              (cond ((null? (car lset)) (hop '()))
                    ((null? (cdr lset)) (car lset))
                    (else (I (car lset)
                             (A (cdr lset)))))))
         (I (lambda (s1 s2)
              (letrec
                ((J (lambda (s1)
                      (cond ((null? s1) '())
                            ((member? (car s1) s2) (J (cdr s1)))  ; (14)
                            (else (cons (car s1)                  ; (15)
                                        (J (cdr s1))))))))        ; (16)
                 (cond ((null? s2) '())
                       (else (J s1)))))))
         (cond ((null? lset) '())
               (else (A lset)))))))

Мое сомнение в строке 14:

((member? (car s1) s2) (J (cdr s1)))

Если (car s1) является членом s2разве это не должно учитываться в результате? Аналогично, в строках 15 и 17:

(else (cons (car s1) (J (cdr s1))))))))

Если это не член s2разве это не должно быть пропущено, не учитывается в результате?

1 ответ

Решение

Неважно... это была ошибка:

http://www.ccs.neu.edu/home/matthias/BTSS/errata.html

Глава 13

Страница 49: А4: поменяйте местами ответы на последние два пункта статьи J

Страница 50: Q2: поменяйте местами ответы на последние два предложения J's Cond

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