highlight.tig

    /* Mandelbrot integer demo
     * Released under the MIT License
     */

    let
      /* Basic types.  */
      type bool = int
      type coord = int
      type value = int
      type array2d = array of value
      type image2d = { nrows : coord, ncols : coord, data : array2d }

      /* Image creation.  */
      function image_new (ncols : coord, nrows : coord) : image2d =
        image2d { nrows = nrows, ncols = ncols,
    	      data = array2d[nrows * ncols] of 0 }

      function image_set (input : image2d, col : coord, row : coord,
    		      value : value) =
        (
          input.data[row * input.ncols + col] := value
        )

      function mandelbrot () =
        let
          type fp = int
          var X : int := 300
          var Y : int := 300
          var ima : image2d := image_new (X, Y)
          var fixsize: int := 16834

          function mul(a : fp, b : fp) : fp = (a*b)/fixsize
          function frac(n : int, d : int) : fp = (n*fixsize)/d

          var xcenter : fp := frac(0016, 10000)
          var ycenter : fp := frac(8224, 10000)
          var xmin : fp := xcenter - frac(5,100)
          var ymin : fp := ycenter - frac(5,100)
          var xmax : fp := xcenter + frac(5,100)
          var ymax : fp := ycenter + frac(5,100)
          var xs   : fp := (xmax - xmin)/X
          var ys   : fp := (ymax - ymin)/Y

        function iterations(x:int, y:int) : int =
        let
            var i : int := 0
            var p : fp := xmin+x*xs
            var q : fp := ymin+y*ys
            var x0 : fp := 0
            var y0 : fp := 0
            var xn : fp := 0
            var four : fp := frac(4,1)
            var two  : fp := frac(2,1)
        in
            while (mul(xn,xn)+mul(y0,y0) < four) & (i < 256) do
            (
                i  := i + 1;
                xn := mul((x0+y0),(x0-y0)) + p;
                y0 := mul(two,mul(x0,y0)) + q;
                x0 := xn
            );
            i
        end

        in

        (for y := 0 to (Y-1) do
            for x := 0 to (X-1) do
                let
                    var i : int  := iterations(x,y)
                 in
                    image_set (ima, x, y, i)
                 end);
        end
    in
        print("Mandelbrot demo\n");
        mandelbrot()
    end