Mandelbrot in Common Lisp, rendered with textual characters:

(defun mandelbrot (width height x-offset y-offset x-scale y-scale) (declare (optimize speed (space 0) (compilation-speed 0))) (labels ((mandelbrot (x-coord y-coord) (let ((max-iter 100)) (loop for x = x-coord then next-x for y = y-coord then next-y for next-x = (+ (* x x) (* -1 y y) x-coord) for next-y = (+ (* 2 x y) y-coord) for iter from 0 below max-iter unless (< (+ (* x x) (* y y)) 4) doing (return (color iter)) finally (return #\Space)))) (color (iter) (let ((iter-mixed (if (evenp iter) (1+ iter) (1- iter)))) (code-char (+ 33 (mod iter-mixed 94))))) (draw (width height) (let* ((type 'float) (x-offset (coerce (- x-offset (/ 1 x-scale 2)) type)) (y-offset (coerce (- y-offset (/ 1 y-scale 2)) type)) (x-res (coerce (/ 1 width x-scale) type)) (y-res (coerce (/ 1 height y-scale) type)) (crosshair-x (round (/ width 2))) (crosshair-y (round (/ height 2)))) (loop for y from y-offset by y-res for y-px from 0 below height doing (fresh-line) doing (loop for x from x-offset by x-res for x-px from 0 below width doing (princ (cond ((and (= y-px crosshair-y) (= x-px (1- crosshair-x))) #\[) ((and (= y-px crosshair-y) (= x-px crosshair-x)) #\+) ((and (= y-px crosshair-y) (= x-px (1+ crosshair-x))) #\]) (t (mandelbrot x y))))))))) (declare (inline mandelbrot color)) (draw (* width 2) height) (values)))