Cuando trabajamos con cadenas de caracteres en Elixir, es común encontrarnos con caracteres especiales que pueden complicar la visualización directa de los textos, como saltos de línea o comillas. Al evaluar estas cadenas en el intérprete, aparecen símbolos como barras invertidas que indican la presencia de estos caracteres especiales, pero que no resultan muy amigables para mostrar al usuario final.
Para manejar esta situación, no basta con confiar en la impresión que hace el intérprete, ya que esta es solo una representación interna del resultado de la evaluación, no una forma adecuada de presentar información en pantalla. Cuando ejecutamos programas fuera del entorno interactivo, necesitamos utilizar mecanismos formales para enviar texto a la terminal o a cualquier otro destino que pueda capturar la salida, como archivos o incluso interfaces web.
En Elixir, la salida estándar y la entrada estándar son los canales habituales para comunicarnos con el exterior. La salida estándar es el lugar donde enviamos texto para que sea mostrado, normalmente en la ventana de la terminal, pero también puede redirigirse a otros dispositivos o programas. La entrada estándar, por su parte, es el medio por el que recibimos información, ya sea desde el teclado, otro programa o incluso a través de conexiones de red.
Para trabajar con estos canales, Elixir nos ofrece funciones específicas en el módulo IO. La función IO.puts es la encargada de imprimir texto en la salida estándar de forma adecuada. A diferencia de la evaluación directa de cadenas, IO.puts interpreta correctamente los caracteres especiales, mostrando saltos de línea y comillas sin las barras invertidas que aparecen en la evaluación. Por ejemplo, si definimos una variable con saltos de línea:
mensaje_2 = "Hola\nMundo\n"
Al evaluarla directamente, veremos los caracteres \n visibles, pero si usamos IO.puts(mensaje_2), el texto se mostrará con los saltos de línea interpretados, es decir, en varias líneas.
Es importante destacar que IO.puts devuelve siempre :ok como resultado, ya que su propósito principal es producir un efecto colateral: imprimir en pantalla. Esto es una excepción dentro del paradigma funcional, donde las funciones suelen ser puras y sin efectos secundarios. Sin embargo, las funciones que interactúan con el mundo exterior, como las de entrada y salida, necesitan tener estos efectos colaterales para funcionar correctamente.
Por otro lado, para capturar información del usuario, contamos con la función IO.gets. Esta función espera a que el usuario introduzca texto por teclado y presione Enter, devolviendo la cadena ingresada, incluyendo el salto de línea final. Podemos pasarle un mensaje como parámetro para mostrar un prompt antes de la entrada, por ejemplo:
entrada = IO.gets("Escribe algo: ")
Si el usuario escribe hola y pulsa Enter, entrada contendrá "hola\n". Para limpiar ese salto de línea y otros espacios en blanco al principio o al final, podemos usar la función String.trim:
entrada_limpia = String.trim(entrada)
De esta forma, obtenemos solo el texto que el usuario ha escrito, sin caracteres adicionales.
En resumen, para interactuar con el usuario o con otros sistemas a través de la terminal en Elixir, es fundamental utilizar IO.puts para mostrar información y IO.gets para recibirla, manejando adecuadamente los caracteres especiales para que la experiencia sea clara y profesional.