Podemos extraer el valor que ocupa un cierto índice de la lista con la notación vista, por ejemplo:
letters = {"a", "d", "f"}
in
letters{2}
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?:
letters = {"a", "d", "f"}
in
letters{7}
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:
letters = {"a", "d", "f"}
in
letters{7}?
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:
letters = {"a", "d", "f"}
in
if letters{7}? = null
then
"n/a"
else
letters{7}
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:
letters = {"a", "d", "f"}
in
letters{7}? ?? "n/a"
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.