Lasaña

Lasaña

Ejercicio de aprendizaje

Introducción

Conceptos básicos

Variables

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!"

Módulos

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

Funciones con nombre

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)

Aridad de las funciones

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

Convenciones de nomenclatura

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 !.

Biblioteca estándar

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..

Comentarios de código

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 #.

Instrucciones

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.

1. Define el tiempo esperado en el horno en minutos

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

2. Calcula el tiempo restante en el horno en minutos

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

3. Calcula el tiempo de preparación en minutos

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

4. Calcula el tiempo total de trabajo en minutos

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

5. Crea una notificación de que la lasaña está lista

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!"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Elixir Exercism

¿Listo para empezar Lasaña?

Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.