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 ().