Cuando trabajamos con listas en Elixir, solemos empezar con ejemplos sencillos, como listas de números o cadenas, pero la realidad es que podemos combinar distintos tipos de datos dentro de ellas. Podemos tener listas que contienen tuplas, listas anidadas, o incluso mezclas complejas como listas de tuplas y tuplas de listas. Por ejemplo, una lista puede contener dos tuplas, como {5, 2, 1, 4} y {5, 1, 2}, o podemos tener listas dentro de listas, que luego podemos aplanar con la función flatten para obtener una lista simple con todos los elementos.
Esta flexibilidad también se extiende a las tuplas, que pueden contener listas o incluso otras tuplas, permitiéndonos construir estructuras de datos muy variadas y anidadas sin problema.
A partir de esta capacidad de combinar listas y tuplas surge un tipo de dato muy interesante en Elixir: las Keyword Lists. Estas son listas de tuplas donde cada tupla tiene un átomo como primer elemento y cualquier otro tipo como segundo elemento. Por ejemplo, una Keyword List puede escribirse así:
[hola: 2.5, adios: 2.2]
Aunque internamente son listas de tuplas, la sintaxis es más compacta y legible, lo que las hace muy útiles para ciertos casos. Las Keyword Lists funcionan como diccionarios ligeros, donde cada átomo actúa como una clave y el valor asociado puede ser cualquier dato. Esto nos permite asociar términos con definiciones, similar a buscar palabras en un diccionario.
Una de las grandes ventajas de las Keyword Lists es que podemos pasarlas fácilmente como parámetros a funciones que aceptan un número variable de argumentos. Esto es especialmente útil cuando no sabemos cuántos parámetros vamos a necesitar o queremos que sean opcionales. Por ejemplo, podemos guardar una Keyword List en una variable y luego consultarla para obtener el valor asociado a una clave específica:
kw_list = [hola: 5, adios: 2]
valor = kw_list[:hola] # Devuelve 5
valor_inexistente = kw_list[:chorrada] # Devuelve nil
Si consultamos una clave que no existe, simplemente obtenemos nil en lugar de un error, lo que hace que el manejo sea seguro y sencillo.
Además, como las Keyword Lists son listas, podemos concatenarlas sin problemas, siempre respetando la inmutabilidad de las estructuras en Elixir. Por ejemplo:
nueva_kw_list = kw_list ++ [buenas: 5]
Esto crea una nueva Keyword List que incluye los elementos anteriores más el nuevo par clave-valor.
Un dato curioso es que, aunque no lo hayamos notado, hemos estado usando Keyword Lists de forma implícita en construcciones comunes como if y def. En Elixir, estas no son funciones convencionales, sino macros que aceptan Keyword Lists para definir bloques de código. Por ejemplo, la sintaxis habitual de un if es:
if condición do
# código si es verdadero
else
# código si es falso
end
Pero gracias a que do y else son claves en una Keyword List, podemos escribir expresiones más compactas cuando solo necesitamos una línea para cada caso:
mensaje = if edad >= 18, do: "Mayor de edad", else: "Menor de edad"
Esto es equivalente a la forma con do y end, pero mucho más conciso. Lo mismo ocurre con definiciones de funciones simples usando def:
def factorial(0), do: 1
Aquí, la función devuelve directamente 1 cuando el argumento es 0, sin necesidad de un bloque do ... end.
En resumen, las Keyword Lists nos permiten escribir código más compacto y legible, especialmente cuando trabajamos con funciones y macros que aceptan parámetros flexibles. Su capacidad para actuar como diccionarios ligeros y su integración con la sintaxis de Elixir las convierten en una herramienta fundamental para manejar parámetros y simplificar expresiones.