Lasagna

Lasagna

Exercício de aprendizagem

Introdução

Noções básicas

Variáveis

Elixir é uma linguagem de tipagem dinâmica, o que significa que o tipo de uma variável só é verificado em tempo de execução. Usando o operador de correspondência =, podemos vincular um valor de qualquer tipo a um nome de variável:

# 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 é uma linguagem de programação funcional e exige que todas as funções nomeadas sejam definidas em um módulo. A palavra-chave defmodule é usada para definir um módulo. Todos os módulos estão disponíveis para todos os outros módulos em tempo de execução e não exigem um modificador de acesso para ficarem visíveis para outras partes do programa. Um módulo é análogo a uma classe em outras linguagens de programação.

defmodule Calculator do
  # ...
end

Funções nomeadas

Funções nomeadas precisam ser definidas em um módulo. A palavra-chave def é usada para definir uma função nomeada pública.

Cada função pode ter zero ou mais argumentos. O valor da última expressão de uma função é sempre retornado implicitamente.

defmodule Calculator do
  def add(x, y) do
    x + y
  end
end

Para invocar uma função, especificamos o nome do módulo e da função e passamos argumentos para cada um dos argumentos da função.

sum = Calculator.add(1, 2)
# => 3

A palavra-chave defp pode ser usada em vez de def para definir uma função privada. Funções privadas só podem ser usadas de dentro do mesmo módulo que as definiu.

Ao invocar uma função dentro do mesmo módulo em que ela foi definida, o nome do módulo pode ser omitido.

Você também pode escrever funções curtas usando uma sintaxe de uma linha (repare na vírgula , e nos dois-pontos : em volta da palavra-chave 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)

Aridade das funções

É comum nos referirmos às funções pela sua aridade. A aridade de uma função é o número de argumentos que ela aceita.

# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
  x + y + z
end

Convenções de nomenclatura

Nomes de módulos devem usar PascalCase. Um nome de módulo precisa começar com uma letra maiúscula A-Z e pode conter letras a-zA-Z, números 0-9 e sublinhados _.

Nomes de variáveis e funções devem usar snake_case. Um nome de variável ou função precisa começar com uma letra minúscula a-z ou um sublinhado _, pode conter letras a-zA-Z, números 0-9 e sublinhados _, e pode terminar com um ponto de interrogação ? ou um ponto de exclamação !.

Biblioteca padrão

Elixir tem uma biblioteca padrão muito rica e bem documentada. A documentação está disponível online em hexdocs.pm/elixir. Salve este link em algum lugar: você vai usá-lo muito!

A maioria dos tipos de dados embutidos tem um módulo correspondente que oferece funções para trabalhar com aquele tipo de dados, por exemplo: existe o módulo Integer para números inteiros, o módulo String para strings, o módulo List para listas e assim por diante.

Um módulo notável é o módulo Kernel. Ele fornece as capacidades básicas sobre as quais o resto da biblioteca padrão é construído, como operadores aritméticos, macros de fluxo de controle e muito mais. As funções do módulo Kernel são importadas automaticamente, então você pode usá-las sem o prefixo Kernel..

Comentários no código

Os comentários podem ser usados para deixar anotações para outros desenvolvedores que leem o código-fonte. Comentários de uma linha em Elixir são precedidos por #.

Instruções

Neste exercício, você vai escrever um pouco de código para ajudar a preparar uma lasanha incrível a partir do seu livro de receitas favorito.

Você tem cinco tarefas, todas relacionadas ao tempo gasto no preparo da lasanha.

1. Definir o tempo esperado no forno em minutos

Defina a função Lasagna.expected_minutes_in_oven/0, que não recebe nenhum argumento e retorna quantos minutos a lasanha deve ficar no forno. De acordo com o livro de receitas, o tempo esperado no forno em minutos é 40:

Lasagna.expected_minutes_in_oven()
# => 40

2. Calcular o tempo restante no forno em minutos

Defina a função Lasagna.remaining_minutes_in_oven/1, que recebe como argumento os minutos reais que a lasanha já passou no forno e retorna quantos minutos a lasanha ainda precisa ficar no forno, com base no tempo esperado no forno em minutos da tarefa anterior.

Lasagna.remaining_minutes_in_oven(30)
# => 10

3. Calcular o tempo de preparo em minutos

Defina a função Lasagna.preparation_time_in_minutes/1, que recebe como argumento o número de camadas que você adicionou à lasanha e retorna quantos minutos você gastou preparando a lasanha, supondo que cada camada leva 2 minutos para preparar.

Lasagna.preparation_time_in_minutes(2)
# => 4

4. Calcular o tempo total de trabalho em minutos

Defina a função Lasagna.total_time_in_minutes/2, que recebe dois argumentos: o primeiro argumento é o número de camadas que você adicionou à lasanha, e o segundo argumento é o número de minutos que a lasanha já passou no forno. A função deve retornar quantos minutos no total você trabalhou no preparo da lasanha, que é a soma do tempo de preparo em minutos com o tempo em minutos que a lasanha passou no forno até o momento.

Lasagna.total_time_in_minutes(3, 20)
# => 26

5. Criar uma notificação de que a lasanha está pronta

Defina a função Lasagna.alarm/0, que não recebe nenhum argumento e retorna uma mensagem indicando que a lasanha está pronta para comer.

Lasagna.alarm()
# => "Ding!"
Editar via GitHub O link abre em uma nova janela ou aba
Elixir Exercism

Tudo pronto para começar Lasagna?

Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.