经验丰富的计划者:Intersectall(第49页)

时间:2014-06-21 17:18:01

标签: functional-programming scheme lisp the-little-schemer

The Seasoned Schemer 的第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 个答案:

答案 0 :(得分:1)

没关系......这是一个错误:

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

第13章

第49页:A4:交换J's cond最后两个条款的答案

第50页:Q2:交换J's cond最后两个条款的答案