## String access

Extra syntactic constructs are provided to access and modify characters in strings:

    expr:
          ...
       |  expr .[ expr ]
       |  expr .[ expr ] <- expr

The expression expr1 `.[` expr2 `]` is equivalent to the application `nth_char` expr1 expr2. In the initial environment, the identifier `nth_char` resolves to a built-in function that returns the character number expr2 in the string denoted by expr1. The first element has number 0; the last element has number n-1, where n is the length of the string. The exception `Invalid_argument` is raised if the access is out of bounds.

The expression expr1 `.[` expr2 `]` `<-` expr3 is equivalent to `set_nth_char` expr1 expr2 expr3. In the initial environment, the identifier `set_nth_char` resolves to a built-in function that modifies in-place the string denoted by expr1, replacing character number expr2 by the value of expr3. The exception `Invalid_argument` is raised if the access is out of bounds. The built-in function returns `()`.