Protección frente al "out-of-bounds"

Podemos extraer el valor que ocupa un cierto índice de la lista con la notación vista, por ejemplo:

let
   letters = {"a", "d", "f"}
in
   letters{2}
f
Protección frente al "out-of-bounds"

En este ejemplo estamos accediendo al valor cuyo índice es 2 (es decir, al tercer valor) y el resultado es "f".

Pero ¿qué ocurriría si indicásemos un índice inexistente?:

let
   letters = {"a", "d", "f"}
in
   letters{7}
Protección frente al "out-of-bounds"

La máquina M nos devuelve un error. Y frecuentemente esto es lo que queremos: que, si los datos no son correctos y, por algún motivo, un valor que debería existir no existe, se muestre en pantalla el error para poder investigarlo.

Pero en ocasiones esta falta de un valor puede ser lógica y lo que querríamos sería que nuestro código devolviese un valor por defecto (y no un error que va a parar la ejecución del proceso ETL). Pues bien, para protegernos de ese error de "out-of-bounds" ("fuera-de-límite") basta con añadir una interrogación ? tras la selección del índice deseado. Por ejemplo:

let
   letters = {"a", "d", "f"}
in
   letters{7}?
null
Protección frente al "out-of-bounds"

Ahora la máquina M devuelve un nulo si el índice indicado no existe.

Si quisiéramos que el valor por defecto fuese otro, por ejemplo, el texto "n/a", bastaría con comprobar si el valor devuelto por nuestra selección (protegida con ?) devuelve o no un nulo:

let
   letters = {"a", "d", "f"}
in
   if letters{7}? = null
   then
      "n/a"
   else
      letters{7}
n/a
Protección frente al "out-of-bounds"

O, mejor todavía, usar el operador de coalescencia nula, ?? (que veremos más adelante) para devolver el primer valor no nulo de la secuencia indicada:

let
   letters = {"a", "d", "f"}
in
   letters{7}? ?? "n/a"
n/a
Protección frente al "out-of-bounds"

Nuestro código comprueba si la evaluación de la expresión letters{7}? devuelve un nulo. En caso negativo, la devuelve como resultado. En caso positivo, evalúa la siguiente expresión ("n/a") y, si no se trata de un nulo, devuelve el resultado de la evaluación.