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