1. #!/usr/bin/csi -s
    
  2. 
    
  3. (define MAX_ITERATIONS 27)
    
  4. (define OUTPUT_RES_X 3.5)
    
  5. (define OUTPUT_RES_Y 2)
    
  6. (define OUTPUT_OFFSET_X -2.5)
    
  7. (define OUTPUT_OFFSET_Y -1)
    
  8. (define RESOLUTION_X 150)
    
  9. (define RESOLUTION_Y 60)
    
  10. 
    
  11. (define (for start end fn)
    
  12.     (if (>= start end)
    
  13.         #t
    
  14.         (begin
    
  15.             (fn start)
    
  16.             (for (+ 1 start) end fn))))
    
  17. 
    
  18. ; turn # interactions into a char for display
    
  19. (define (show val) 
    
  20.     (if (<= val 26)
    
  21.         (integer->char (+ val 
    
  22.                           -1
    
  23.                           (char->integer #\A)))
    
  24.         " "))
    
  25. ; Calculate how many iterations are required.
    
  26. (define (calc x y) 
    
  27.     (let (
    
  28.       (xi (+ OUTPUT_OFFSET_X (* OUTPUT_RES_X (/ x RESOLUTION_X))))
    
  29.       (yi (+ OUTPUT_OFFSET_Y (* OUTPUT_RES_Y (/ y RESOLUTION_Y)))))
    
  30.     (define (calc_inner x y iters) 
    
  31.         (if (or (>= iters MAX_ITERATIONS)
    
  32.                 (< 4 (+ (* x x) (* y y))))
    
  33.             iters
    
  34.             (let (
    
  35.                   (xnext (+ xi (* x x) (* -1 y y)))
    
  36.                   (ynext (+ yi (* x y 2))))
    
  37.                 (calc_inner xnext ynext (+ 1 iters)))))
    
  38.     (calc_inner 0 0 0)))
    
  39. (define (draw_row y width)
    
  40.     (for 0 width (lambda (x)
    
  41.         (display (show (calc x y))))))
    
  42. (define (draw_window width height) 
    
  43.     (for 0 height (lambda (y)
    
  44.         (begin
    
  45.             (draw_row y width)
    
  46.             (display "\n")))))
    
  47.         
    
  48. 
    
  49. (draw_window RESOLUTION_X RESOLUTION_Y)
    
  50. 
    
  51.