Subsections

- Exercises

#
Trimming

The bounds of a multiple can be changed using the `@` construction. For example, in the declaration

       []CHAR digits = "0123456789"[@0]

the bounds of `digits` are `[0:9]`. Bounds do not have to be non-negative. For example,

       [,]INT ii = ((1,2,3),(4,5,6));
       [,]INT jj = ii[@-3,@-50]

whence the bounds of `jj` are `[-3:-4,-50:-48]`. Notice that you cannot change the bounds of a row-display (except by using a cast--see section 10.5). For now, always declare an identifier for the display, and then alter the bounds. The bounds of a slice can be changed:

       [,]INT ij = ((1,3,5),(7,9,11),(13,15,17));
        []INT ij2 = ij[2,][@0]

The declaration for `ij2` could also be written

       []INT ij2 = ij[2,@0]

`@` can also be written `AT`.

Wherever an integer is required in the above, any unit yielding an integer will do. Thus it is quite in order to use the formula

       (a+b) UPB r

where the parentheses are necessary if `a+b` is expected to yield the dimension of `r` under consideration (because the priority of `UPB` is greater than the priority of `+`).

A trimmer uses the `:` construction. In the context of the declaration of `digits` above, the phrase `digits[1:3]` yields the value `"123"` with mode `[]CHAR`. Again, using the declaration of `r` in the last set of exercises, `r[1:2,1]` yields `(1,2)`, and `r[1:2,1:2]` yields `((1,2),(5,6))`.

Trimming is particularly useful with values of mode `[]CHAR`. Given the declaration

       []CHAR quote = "Habent sua fata libelli"

(the quotation at the start of the acknowledgements in the “Revised Report”),

       quote[:6]
       quote[8:10]
       quote[12:15]

yield the first three words. Note that when the first subscript in a trimmer is omitted, the lower bound for that dimension is assumed, while omission of the second subscript assumes the corresponding upper bound. Again, any unit yielding `INT` may be used for the trimmers. The context for a trimmer or a subscript is meek.

Omission of both subscripts yields the whole slice with a lower bound of 1. So, the upper bound of the phrase `digits[:]` is `10` which is equivalent to `digits[@1]`.

The lower bound of a `trimmer` is, by default, `1`, but may be changed by the use of `@`. For example, `digits[3:6]` has bounds `[1:4]`, but `digits[3:6@2]` has bounds `[2:5]`. The bounds of `quote[17:]` mentioned above are `[1:7]`.

## Exercises

3.7
  Write an identity declaration for `months` on the lines of the declaration of `days` in section 3.1. Ans
3.8
  Given the declarations

         [,]INT i = ((1,-2,3,4),(-5,6,7,8));
         []REAL r= (1.4,0,-5.4,3.6);
         []CHAR s= "abcdefghijklmnopqrstuvwxyz"
                                      [@ ABS"a"]

  what are the values of the following phrases? Ans
  (a)
    `2 UPB i + UPB s[@1]`

  (b)
    `r[2:3]`

  (c)
    `i[2,2] - r[3]`

  (d)
    `i[2,2:]`

  (e)
    `s[ABS"p":ABS"t"]`