Elixir es un lenguaje de tipado dinámico, lo que significa que el tipo de una variable solo se comprueba en tiempo de ejecución. Con el operador de coincidencia =, podemos vincular un valor de cualquier tipo a un nombre de variable:
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir es un lenguaje de programación funcional y exige que todas las funciones con nombre se definan dentro de un módulo. La palabra clave defmodule se usa para definir un módulo. Todos los módulos están disponibles para el resto de módulos en tiempo de ejecución y no necesitan un modificador de acceso para ser visibles desde otras partes del programa. Un módulo es análogo a una clase en otros lenguajes de programación.
defmodule Calculator do
# ...
end
Las funciones con nombre deben definirse dentro de un módulo. La palabra clave def se usa para definir una función con nombre pública.
Cada función puede tener cero o más argumentos. El valor de la última expresión de una función siempre se devuelve de forma implícita.
defmodule Calculator do
def add(x, y) do
x + y
end
end
Para invocar una función, hay que indicar su módulo y su nombre, y pasar un argumento por cada uno de los argumentos de la función.
sum = Calculator.add(1, 2)
# => 3
La palabra clave defp se puede usar en lugar de def para definir una función privada. Las funciones privadas solo se pueden usar desde el mismo módulo que las define.
Cuando se invoca una función dentro del mismo módulo en el que está definida, se puede omitir el nombre del módulo.
También puedes escribir funciones cortas con una sintaxis de una sola línea (fíjate en la coma , y los dos puntos : alrededor de la palabra clave do).
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
Es habitual referirse a las funciones por su aridad. La aridad de una función es el número de argumentos que acepta.
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
Los nombres de los módulos deben usar PascalCase. Un nombre de módulo debe empezar por una letra mayúscula A-Z y puede contener letras a-zA-Z, números 0-9 y guiones bajos _.
Los nombres de variables y de funciones deben usar snake_case. Un nombre de variable o de función debe empezar por una letra minúscula a-z o un guion bajo _, puede contener letras a-zA-Z, números 0-9 y guiones bajos _, y puede terminar con un signo de interrogación ? o un signo de exclamación !.
Elixir tiene una biblioteca estándar muy completa y bien documentada. La documentación está disponible en línea en hexdocs.pm/elixir. Guarda este enlace en algún sitio, ¡lo usarás un montón!
La mayoría de los tipos de datos integrados tienen un módulo correspondiente que ofrece funciones para trabajar con ese tipo de datos; por ejemplo, existe el módulo Integer para los números enteros, el módulo String para los strings, el módulo List para las listas, etc.
Un módulo destacable es el módulo Kernel. Proporciona las capacidades básicas sobre las que se construye el resto de la biblioteca estándar, como los operadores aritméticos, las macros de control de flujo y mucho más. Las funciones del módulo Kernel se importan automáticamente, así que puedes usarlas sin el prefijo Kernel..
Los comentarios se pueden usar para dejar notas a otros desarrolladores que lean el código fuente. Los comentarios de una sola línea en Elixir van precedidos de #.
En este ejercicio vas a escribir algo de código para ayudarte a cocinar una lasaña magnífica de tu libro de cocina favorito.
Tienes cinco tareas, todas relacionadas con el tiempo que se dedica a cocinar la lasaña.
Define la función Lasagna.expected_minutes_in_oven/0 que no recibe ningún argumento y devuelve cuántos minutos debe estar la lasaña en el horno. Según el libro de cocina, el tiempo esperado en el horno en minutos es 40:
Lasagna.expected_minutes_in_oven()
# => 40
Define la función Lasagna.remaining_minutes_in_oven/1 que recibe como argumento los minutos reales que la lasaña lleva en el horno y devuelve cuántos minutos le quedan aún a la lasaña en el horno, partiendo del tiempo esperado en el horno en minutos de la tarea anterior.
Lasagna.remaining_minutes_in_oven(30)
# => 10
Define la función Lasagna.preparation_time_in_minutes/1 que recibe como argumento el número de capas que añadiste a la lasaña y devuelve cuántos minutos pasaste preparando la lasaña, suponiendo que preparar cada capa te lleva 2 minutos.
Lasagna.preparation_time_in_minutes(2)
# => 4
Define la función Lasagna.total_time_in_minutes/2 que recibe dos argumentos: el primer argumento es el número de capas que añadiste a la lasaña, y el segundo argumento es el número de minutos que la lasaña lleva en el horno. La función debe devolver cuántos minutos en total has trabajado cocinando la lasaña, que es la suma del tiempo de preparación en minutos y el tiempo en minutos que la lasaña ha pasado en el horno en ese momento.
Lasagna.total_time_in_minutes(3, 20)
# => 26
Define la función Lasagna.alarm/0 que no recibe ningún argumento y devuelve un mensaje que indica que la lasaña está lista para comer.
Lasagna.alarm()
# => "Ding!"
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.