(define (make-product m1 m2)
  (cond ((or (=number? m1 0) (=number? m2 0)) 0)
        ((=number? m1 1) m2)
        ((=number? m2 1) m1)
        ((and (number? m1) (number? m2)) (* m1 m2))
        ((and (number? m1) (product? m2) (number? (cadr m2))) 
         (list '* (* m1 (cadr m2)) (caddr m2)))
        (else (list '* m1 m2))))
