さかもとのブログ

つらつらと

SICP演習問題4.76~4.79

パスします.
4.76は少し取り組んでみて、以下のような感じになるのかぁという感じでですが、merge-frameの実装がいまいち浮かばず...

(define (conjoin2 conjoins frame-stream)
  (if (empty-conjunction? conjoins)
      frame-stream
      (let ((join1 (qeval (first-conjunct conjoins)
                            frame-stream)))
             (let ((join2 (conjoins2 (rest-conjuncts conjoins)
                                       frame-stream)))
               (stream-flatmap (lambda (frame1)
                                 (stream-flatmap (lambda (frame2)
                                                   (let ((result (merge-frame frame1 frame2)))
                                                     (if result
                                                         (singleton-stream result)
                                                         the-empty-stream)))
                                                 join2))
                                 join1)))))