Up to Main Index                             Up to Journal for April, 2023

                    JOURNAL FOR THURSDAY 27TH APRIL, 2023
______________________________________________________________________________

SUBJECT: You want more examples!?
   DATE: Thu 27 Apr 20:08:16 BST 2023

After writing last time about implementing a programming language, people are
asking me for more Mere code examples. I’m running out! I’m spending so much
time on Mere itself, and tests, I’ve not written much example code recently.

I have one new example, it’s modified to run in the current Mere ICE[1]. The
original was written as an example of the new dimension array “dim” built-in.
The code’s one main interesting feature here is the use of a common iterate
subroutine to initialize a grid, populate the grid and then display the grid
by applying different subroutines to the grid cells:


    >cat timesTable.mr
    /*
      A mere multiplication table generator...

      This program displays a multiplication table of size ROWS×COLS.
    */
    ROWS=12
    COLS=12

    grid  = [int]();
    ifunc = alloc;   gosub iterate
    ifunc = fill;    gosub iterate
    ifunc = display; gosub iterate
    exit

    alloc:
      if !exists grid y; grid[y] = []string()
      grid[y] = []string grid[y] ""
    return

    fill:
      v = y*x
      if y==0; v = x
      if x==0; v = y
      if v==0; v = "×"
      grid[y][x] = string v
    return

    display:
      printf "%4s" grid[y][x]
      if x == COLS; println
    return

    iterate:
      y=0; yloop:
        x=0; xloop:
          gosub ifunc // Magic :)
        if x++ <= COLS; goto xloop
      if y++ <= ROWS; goto yloop
    return

    >mere timesTable.mr
       ×   1   2   3   4   5   6   7   8   9  10  11  12
       1   1   2   3   4   5   6   7   8   9  10  11  12
       2   2   4   6   8  10  12  14  16  18  20  22  24
       3   3   6   9  12  15  18  21  24  27  30  33  36
       4   4   8  12  16  20  24  28  32  36  40  44  48
       5   5  10  15  20  25  30  35  40  45  50  55  60
       6   6  12  18  24  30  36  42  48  54  60  66  72
       7   7  14  21  28  35  42  49  56  63  70  77  84
       8   8  16  24  32  40  48  56  64  72  80  88  96
       9   9  18  27  36  45  54  63  72  81  90  99 108
      10  10  20  30  40  50  60  70  80  90 100 110 120
      11  11  22  33  44  55  66  77  88  99 110 121 132
      12  12  24  36  48  60  72  84  96 108 120 132 144
    >


Not very exciting, not optimized, but the code is somewhat interesting…

For the original version, available with the next update of Mere ICE, the
alloc subroutine becomes:


    alloc:
      if x > 0; return
      grid[y] = dim []string() (x = COLS+1)
    return


This shaves off 2548 instructions executed — about a 27% reduction.

--
Diddymus

  [1] Mere ICE[2]: /annex/mere/ice.html

  [2] I need to add a way of pushing example code from articles into Mere ICE…


  Up to Main Index                             Up to Journal for April, 2023