Code Review

Compare your solutions

    #lang racket

(require srfi/41)

(define (integers-starting-from n)
  (stream-cons n
               (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))

(define (merge-weighted s1 s2 weight)
  (cond ((stream-empty? s1) s2)
        ((stream-empty? s2) s1)
        (else (let ((x1 (stream-car s1))
                    (x2 (stream-car s2)))
                (if (<= (weight x1) (weight x2))
                    (stream-cons x1 (merge-weighted (stream-cdr s1) s2 weight))
                    (stream-cons x2 (merge-weighted s1 (stream-cdr s2) weight)))))))

(define (weighted-pairs s t weight)
  (stream-cons
   (cons (stream-car s) (stream-car t))
   (merge-weighted
    (stream-map (lambda (x) (cons (stream-car s) x))
                (stream-cdr t))
    (weighted-pairs (stream-cdr s) (stream-cdr t) weight) weight)))

(define (sum-of-cube x)
  (let ((i (car x)) (j (cdr x)))
    (+ (* i i i) (* j j j))))

(define (sum-of-square x)
  (let ((i (car x)) (j (cdr x)))
    (+ (* i i) (* j j))))

(define sorted-pairs
  (weighted-pairs integers integers
                  sum-of-cube))

(define ramanujan-numbers
  (stream-map (lambda (x) (sum-of-cube (cdr x)))
              (stream-filter (lambda (x) (= (sum-of-cube (car x)) (sum-of-cube (cdr x))))
                             (stream-map cons sorted-pairs (stream-cdr sorted-pairs)))))

(define sorted-pairs-2
  (weighted-pairs integers integers
                  sum-of-square))

(define good-numbers
  (stream-map (lambda (x) (cons (sum-of-square (car x)) x))
              (stream-filter (lambda (x) (= (sum-of-square (car x))
                                            (sum-of-square (cadr x))
                                            (sum-of-square (caddr x))))
                             (stream-map list
                                         sorted-pairs-2
                                         (stream-cdr sorted-pairs-2)
                                         (stream-cdr (stream-cdr sorted-pairs-2))))))