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.