;;;;----------------------------
;;;; 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)))))