Lasanha

Lasanha

Exercício de aprendizagem

Introdução

Noções básicas

Variáveis

O Elixir é uma linguagem de tipo dinâmico, o que significa que o tipo de uma variável só é verificado em tempo de execução. Com o operador de correspondência =, podemos associar 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

O Elixir é uma linguagem de programação funcional e exige que todas as funções nomeadas sejam definidas num módulo. A palavra-chave defmodule serve para definir um módulo. Todos os módulos estão disponíveis para os restantes módulos em tempo de execução e não precisam de um modificador de acesso para ficarem visíveis a outras partes do programa. Um módulo é análogo a uma classe noutras linguagens de programação.

defmodule Calculator do
  # ...
end

Funções nomeadas

As funções nomeadas têm de ser definidas num módulo. A palavra-chave def serve 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 devolvido implicitamente.

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

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

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

Podes usar a palavra-chave defp em vez de def para definir uma função privada. As funções privadas só podem ser usadas dentro do próprio módulo que as definiu.

Ao invocar uma função dentro do próprio módulo onde está definida, podes omitir o nome do módulo.

Também podes escrever funções curtas com uma sintaxe de uma só linha (repara na vírgula , e nos dois pontos : à 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 referir as funções pela sua aridade. A aridade de uma função é o número de argumentos que 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

Os nomes dos módulos devem usar PascalCase. Um nome de módulo tem de começar por uma letra maiúscula A-Z e pode conter letras a-zA-Z, números 0-9 e underscores _.

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

Biblioteca padrão

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

A maioria dos tipos de dados incorporados tem um módulo correspondente que oferece funções para trabalhar com esse tipo de dados. Por exemplo, há 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 que vale a pena destacar é o módulo Kernel. Fornece as capacidades básicas sobre as quais o resto da biblioteca padrão é construído, como operadores aritméticos, macros de fluxo de controlo e muito mais. As funções do módulo Kernel são importadas automaticamente, por isso podes usá-las sem o prefixo Kernel..

Comentários no código

Os comentários podem ser usados para deixar notas a outros programadores que leiam o código-fonte. Em Elixir, os comentários de uma só linha são precedidos por #.

Instruções

Neste exercício vais escrever algum código para te ajudar a cozinhar uma lasanha fantástica do teu livro de cozinha preferido.

Tens cinco tarefas, todas relacionadas com o tempo gasto a cozinhar a lasanha.

1. Define o tempo esperado no forno, em minutos

Define a função Lasagna.expected_minutes_in_oven/0, que não recebe argumentos e devolve quantos minutos a lasanha deve estar no forno. De acordo com o livro de cozinha, o tempo esperado no forno é de 40 minutos:

Lasagna.expected_minutes_in_oven()
# => 40

2. Calcula o tempo restante no forno, em minutos

Define a função Lasagna.remaining_minutes_in_oven/1, que recebe como argumento os minutos que a lasanha já esteve no forno e devolve quantos minutos a lasanha ainda tem de permanecer no forno, com base no tempo esperado no forno da tarefa anterior.

Lasagna.remaining_minutes_in_oven(30)
# => 10

3. Calcula o tempo de preparação, em minutos

Define a função Lasagna.preparation_time_in_minutes/1, que recebe como argumento o número de camadas que adicionaste à lasanha e devolve quantos minutos gastaste a preparar a lasanha, partindo do princípio de que cada camada demora 2 minutos a preparar.

Lasagna.preparation_time_in_minutes(2)
# => 4

4. Calcula o tempo total de trabalho, em minutos

Define a função Lasagna.total_time_in_minutes/2, que recebe dois argumentos: o primeiro é o número de camadas que adicionaste à lasanha e o segundo é o número de minutos que a lasanha esteve no forno. A função deve devolver quantos minutos, no total, trabalhaste a cozinhar a lasanha, ou seja, a soma do tempo de preparação, em minutos, com o tempo, em minutos, que a lasanha esteve no forno até ao momento.

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

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

Define a função Lasagna.alarm/0, que não recebe argumentos e devolve uma mensagem a indicar que a lasanha está pronta a comer.

Lasagna.alarm()
# => "Ding!"
Editar via GitHub A ligação abre numa nova janela ou separador
Elixir Exercism

Estás pronto para começar Lasanha?

Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.