Keyword lists: listas de palabras clave

La primera estructura de datos asociativa que vamos a ver es la lista de palabras clave o keyword list, que permite asociar valores a átomos. Aquí su construcción, consulta con el operador [:x], y una particularidad importante sobre do, end y else que tal vez te ayude mucho.

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.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos