Charlists

Si alguna vez te ha pasado la de crear una lista de enteros y que te lo muestre como un montón de caracteres, no es que se haya roto tu instalación de Elixir, es que estás tratando con una charlist. No se usa mucho, pero ahí está. 00:00 Introducción a las charlists 03:02 Historias sobre codificación: la tabla ASCII 06:20 Codificación internacional: Unicode 08:12 Un caracter Unicode es más de un byte 09:05 Resumen de todo esto

Cuando trabajamos con Elixir, es posible que en algún momento nos hayamos topado con una situación curiosa al imprimir listas que contienen números. Por ejemplo, si tenemos una lista con valores como 104, 111, 108, 97, en lugar de ver esos números, Elixir nos muestra la palabra hola entre comillas simples. Esto puede resultar desconcertante, especialmente porque sabemos que las cadenas de texto en Elixir se escriben con comillas dobles.

Lo que está ocurriendo aquí es que Elixir está interpretando esa lista de números como un charlist, o lista de caracteres. Los charlists no son un concepto nuevo, sino que provienen de Erlang, y aunque en Elixir no se usan mucho, aparecen cuando interactuamos con código Erlang o cuando Elixir detecta que una lista de números puede representarse como caracteres imprimibles. En esencia, si los números dentro de la lista corresponden a valores dentro del rango imprimible de la tabla Unicode, Elixir los muestra como una cadena de caracteres con comillas simples para indicar que es un charlist.

Esto es simplemente una forma de representación para facilitar la lectura, no significa que la lista haya cambiado su naturaleza. De hecho, las bitstrings funcionan de manera similar: si contienen valores que pueden interpretarse como caracteres, Elixir las mostrará como cadenas normales. Por ejemplo, una bitstring con los bytes 104, 111, 108, 97 también se imprimirá como hola.

Para entender mejor por qué sucede esto, es útil recordar cómo se codifican los caracteres en los ordenadores. Hace décadas, se creó la tabla ASCII para asignar un número a cada letra o símbolo, de modo que los ordenadores pudieran almacenar y mostrar texto correctamente. Por ejemplo, la letra 'M' tiene el código 77 en ASCII. Esta tabla incluye caracteres imprimibles como letras, números y espacios, pero también caracteres de control que no se imprimen, como el código 0 (nul) o el 10 (salto de línea).

Sin embargo, ASCII solo cubre 127 caracteres, lo que no es suficiente para representar todos los alfabetos y símbolos del mundo. Por eso se desarrolló Unicode, un sistema mucho más amplio que incluye todos los alfabetos conocidos, símbolos especiales, emoticonos e incluso caracteres históricos como el cuneiforme. Unicode asigna un número único a cada carácter, y puede requerir más de un byte para representarlos. Por ejemplo, la letra 'ñ' puede ocupar dos bytes en Unicode, con valores 195 y 177.

Esto nos lleva a una conclusión importante: no debemos asumir que un byte equivale a un carácter. Muchos caracteres, especialmente fuera del rango ASCII básico, necesitan más de un byte para su representación. Por eso, cuando Elixir imprime listas o bitstrings, puede decidir mostrarlas como charlists o strings si los valores corresponden a caracteres imprimibles.

Aunque los charlists no son muy comunes en Elixir y su uso principal es la interoperabilidad con Erlang, entender cómo y por qué Elixir los muestra nos ayuda a depurar y comprender mejor nuestros programas. Saber que Elixir convierte listas de números en cadenas legibles cuando es posible, y que esto está basado en estándares históricos como ASCII y Unicode, nos da una perspectiva más clara sobre cómo se manejan los datos de texto en el lenguaje.

En definitiva, conocer estos detalles sobre charlists, bitstrings y la codificación de caracteres nos permite trabajar con Elixir de manera más informada y evitar confusiones al interpretar la salida de nuestras listas y cadenas. Así, aunque no usemos charlists directamente, entender su existencia y representación nos prepara para situaciones donde la interoperabilidad con Erlang o la manipulación de datos binarios sea necesaria.

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