1/* Mandelbrot integer demo 2 * Released under the MIT License 3 */ 4 5let 6 /* Basic types. */ 7 type bool = int 8 type coord = int 9 type value = int 10 type array2d = array of value 11 type image2d = { nrows : coord, ncols : coord, data : array2d } 12 13 /* Image creation. */ 14 function image_new (ncols : coord, nrows : coord) : image2d = 15 image2d { nrows = nrows, ncols = ncols, 16 data = array2d[nrows * ncols] of 0 } 17 18 function image_set (input : image2d, col : coord, row : coord, 19 value : value) = 20 ( 21 input.data[row * input.ncols + col] := value 22 ) 23 24 function mandelbrot () = 25 let 26 type fp = int 27 var X : int := 300 28 var Y : int := 300 29 var ima : image2d := image_new (X, Y) 30 var fixsize: int := 16834 31 32 function mul(a : fp, b : fp) : fp = (a*b)/fixsize 33 function frac(n : int, d : int) : fp = (n*fixsize)/d 34 35 var xcenter : fp := frac(0016, 10000) 36 var ycenter : fp := frac(8224, 10000) 37 var xmin : fp := xcenter - frac(5,100) 38 var ymin : fp := ycenter - frac(5,100) 39 var xmax : fp := xcenter + frac(5,100) 40 var ymax : fp := ycenter + frac(5,100) 41 var xs : fp := (xmax - xmin)/X 42 var ys : fp := (ymax - ymin)/Y 43 44 function iterations(x:int, y:int) : int = 45 let 46 var i : int := 0 47 var p : fp := xmin+x*xs 48 var q : fp := ymin+y*ys 49 var x0 : fp := 0 50 var y0 : fp := 0 51 var xn : fp := 0 52 var four : fp := frac(4,1) 53 var two : fp := frac(2,1) 54 in 55 while (mul(xn,xn)+mul(y0,y0) < four) & (i < 256) do 56 ( 57 i := i + 1; 58 xn := mul((x0+y0),(x0-y0)) + p; 59 y0 := mul(two,mul(x0,y0)) + q; 60 x0 := xn 61 ); 62 i 63 end 64 65 in 66 67 (for y := 0 to (Y-1) do 68 for x := 0 to (X-1) do 69 let 70 var i : int := iterations(x,y) 71 in 72 image_set (ima, x, y, i) 73 end); 74 end 75in 76 print("Mandelbrot demo\n"); 77 mandelbrot() 78end 79