#lang typed/racket/base #:optimize (require racket/future racket/flonum) (define MAX-ITERS 50) (define MAX-DIST 2.0) (define N 512) (: mandelbrot-point : Integer Integer -> Integer) (define (mandelbrot-point x y) (define ci (fl- (fl/ (fl* 2.0 (->fl y))(->fl N)) 1.0)) (define cr (fl- (fl/ (fl* 2.0 (->fl x))(->fl N)) 1.5)) (let loop ((i 0) (zr 0.0) (zi 0.0)) (if (> i MAX-ITERS) (char->integer #\*) (let ((zrq (fl* zr zr)) (ziq (fl* zi zi))) (if (fl> (fl+ zrq ziq) (fl* MAX-DIST MAX-DIST)) (char->integer #\space) (loop (add1 i) (fl+ (fl- zrq ziq) cr) (fl+ (fl* 2.0 (fl* zr zi)) ci))))))) (: fs (Listof (Futureof Bytes))) (define fs (for/list ([y (in-range N)]) (let ([bstr (make-bytes N)]) (future (lambda () (for ([x (in-range N)]) (bytes-set! bstr x (mandelbrot-point x y))) bstr))))) (for: ([f : (Futureof Bytes) (in-list fs)]) (write-bytes (touch f)) (newline))