#lang racket (define head car) (define tail (lambda (stream) (force (cdr stream)))) (define take (lambda (n stream) (if (eq? n 0) '() (cons (car stream) (take (- n 1) (tail stream)))))) (define ones (cons 1 (delay ones))) (define nats (letrec ((next (lambda (n) (cons n (delay (next (+ n 1))))))) (next 0))) (define lmap (lambda (f stream) (cons (f (head stream)) (delay (lmap f (tail stream)))))) (define (add-streams s1 s2) (let ((h1 (head s1)) (h2 (head s2))) (cons (+ h1 h2) (delay (add-streams (tail s1) (tail s2)))))) (define wtfib (cons 0 (delay (cons 1 (delay (add-streams (tail wtfib) wtfib))))))