Streams in Scheme

;;;;----------------------------
;;;; Merge two streams

  (define merge$
    (lambda (s1 s2)
      (cond ((null? s1) s2)
            ((null? s2) s1)
            ((< (car s1) (car s2))
             (cons (car s1) (lambda () (merge$ ((cdr s1)) s2))))
            (else
             (cons (car s2) (lambda () (merge$ ((cdr s2)) s1)))))))

;;;;---------------------------------------------------------------
;;;; Multiply each token in a stream by a specified number t

  (define *$
    (lambda (t s)
      (if (null? s)
          '()
          (cons (* t (car s)) (lambda () (*$ t ((cdr s))))))))

;;;;---------------------------------------------------
;;;; Solution to Hamming's Problem using streams

  (define ham
    (lambda (p)
      (if (null? p)
          '()
          (cons (car p) (lambda () (merge$ (*$ (car p) (ham p)) (ham (cdr p))))))))

;;;;------------------------------
;;;; Tests

  (define test
    (lambda (p)
      (let ((a (ham p)))
        (letrec ((b (lambda (l)
                      (display (car l))(newline)
                      (b ((cdr l))))))
          (b a)))))