Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

01/10/2024

aula-01-2024.livemd

01/10/2024

Tipos Básicos

  1340
"Felipe Costa"
3.36666666
10 / 3
:age

Tipos básicos:

  • Números inteiros
  • Strings
  • Números de ponto flutuante
  • Átomos

Tipos complexos

[]
[1, 2, 3, 4, 5]
["elixir", :atom, 1, 2, 2.5]
{1, "José Valim"}
{2.7, "teste", []}
%{"Felipe" => 10, "Costa" => 5}
Map.keys(%{"Felipe" => 10, "Costa" => 5})
Map.values(%{"Felipe" => 10, "Costa" => 5})

Operadores

10/3
10 - 3
10 + 3 * 10
10 + 11
20 * 2
"AFRICA " <> "DO " <> "SUL"

Funções

String.upcase("brasil")
"BRASIL" == String.upcase("brasil")
String.capitalize("brasil")
String.at("Brasil", 2)

Criar suas próprias funções

defmodule Urna do
  def vota(nome_pessoa_candidata) do
    "Você votou em #{nome_pessoa_candidata}!"
  end

  def vota(numero, nome) do
    "Você votou em #{numero} - #{nome}!"
  end

  def vota(urna, numero, nome) do
    [{numero, nome} | urna] 
  end

  def resultado(urna) do
    urna
    |> Enum.map(fn {_numero, pessoa} -> pessoa end)
    |> Enum.frequencies()
    |> Map.to_list()
  end

  def mostra_vencedor(lista) do
    {nome_do_vencedor, votos} = Enum.max_by(lista, fn {_nome, votos} -> votos end)
    "A pessoa vencedora da eleição foi #{nome_do_vencedor} com #{votos} votos"
  end
end
Urna.vota("José Valim")

Urna.vota("Joe Armstrong")
Urna.vota(26, "Robert Virding")
urna = []

urna = Urna.vota(urna, 1, "José Valim")
urna = Urna.vota(urna, 2, "Robert Virding")
urna = Urna.vota(urna, 2, "Robert Virding")
urna = Urna.vota(urna, 3, "Joe Armstrong")
urna = Urna.vota(urna, 1, "José Valim")
urna = Urna.vota(urna, 4, "Mike Williams")
[]
 |> Urna.vota(1, "José Valim")
 |> Urna.vota(2, "Robert Virding")
 |> Urna.vota(2, "Robert Virding")
 |> Urna.vota(3, "Joe Armstrong")
 |> Urna.vota(1, "José Valim")
 |> Urna.vota(4, "Mike Williams")
[]
 |> Urna.vota(1, "José Valim")
 |> Urna.vota(2, "Robert Virding")
 |> Urna.vota(2, "Robert Virding")
 |> Urna.vota(3, "Joe Armstrong")
 |> Urna.vota(1, "José Valim")
 |> Urna.vota(4, "Mike Williams")
 |> Urna.vota(1, "José Valim")
 |> dbg()

Calculando quem ganhou (Depois que a eleição termina)

[]
 |> Urna.vota(1, "José Valim")
 |> Urna.vota(2, "Robert Virding")
 |> Urna.vota(2, "Robert Virding")
 |> Urna.vota(3, "Joe Armstrong")
 |> Urna.vota(1, "José Valim")
 |> Urna.vota(4, "Mike Williams")
 |> Urna.vota(1, "José Valim")
 |> Urna.vota(1, "José Valim")
 |> Urna.resultado()
 |> Urna.mostra_vencedor()
 |> dbg()

Funções do Módulo Enum

defmodule Math do
  def double(x) do
    x * 2
  end
end

Enum.map([10, 4, 3], &amp;Math.double/1)

Enum.map([10, 5, 7], fn x -> x * 2 end)

Enum.map([1, 2, 3], &amp;(&amp;1 * 2))
  lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Enum.filter(lista, fn x -> rem(x, 2) == 0 end)
lista 
|> Enum.filter(&amp;(rem(&amp;1, 2) == 0)) 
Enum.map(lista, fn x -> x * x end)
lista = [10, 20, 30, 40, 50]
Enum.reduce(lista, 0, fn x, acc -> x + acc end)
lista 
|> Enum.reduce(0, &amp;(&amp;1 + &amp;2))
lista = ["a", "b", "c", "d", "e"]
Enum.count(lista)
lista = [1, 3, 5, 7, 9]
Enum.find(lista, fn x -> x > 5 end)
lista
|> Enum.filter(fn x -> x > 5 end) 
|> Enum.map(fn x -> x end)  
lista = [-1, 2, 3, 4, 5]
Enum.any?(lista, fn x -> x < 0 end)
tuplas = [{1, "a"}, {2, "b"}, {1, "c"}, {2, "d"}]
Enum.group_by(tuplas, fn {key, _} -> key end)
lista = [5, 3, 8, 1, 4]
Enum.sort(lista)
lista = [1, 2, 2, 3, 4, 4, 5]
Enum.uniq(lista)
lista = [[1, 2], [3, 4], [5, 6]]
Enum.zip_with(lista, fn [x, y, z] -> x + y + z end)
lista = [1, 2, 3, 4, 5, 6]
Enum.chunk_every(lista, 2)
lista = [1, 2, 3, 4, 5]
Enum.sum(lista)
lista = [1, 2, 3, 4]
Enum.reduce(lista, 1, fn x, produto -> x * produto end)
lista = [10, 20, 30, 40]
defmodule CalcularMedia do
  def calcular_media(lista) do
    soma = Enum.sum(lista)
    contagem = Enum.count(lista)

    if contagem > 0 do
      soma / contagem
    else
      0
    end
  end
end
media = CalcularMedia.calcular_media(lista)
IO.puts(media)
lista  = [1, 2, 3, 4]
Enum.all?(lista, fn x -> x > 0 end)
lista1 = [1, 2, 3] 
lista2 = [4, 5, 6]
Enum.concat(lista1, lista2)
lista = ["a", "b", "c", "d"]
Enum.each(lista, fn x -> IO.puts(x) end)
lista = ["hello", "world"]
  Enum.reduce(lista, "", fn elemento, conc -> 
    if conc == "" do
       elemento
    else
       conc <> " " <> elemento
    end
  end)
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Enum.filter(lista, fn x -> rem(x, 3) == 0 end)
lista = [:apple, :banana, :apple, :orange, :banana, :banana]
Enum.frequencies(lista)
lista = ["apple", "banana", "cherry", "date", "fig"]
Enum.filter(lista, fn x -> String.length(x) > 4 end)
lista = [1, 2, 3, 4, 5]
Enum.map(lista, fn x -> x * 2 end)
lista = [7, 3, 1, 5, 9]
Enum.min(lista)
lista = [12, 4, 18, 7, 5]
Enum.max(lista)
lista = ["cat", "dog", "elephant", "tiger", "one"]
Enum.count(lista, fn x -> 
  String.length(x) < 5
  end)
lista = [2, 4, 6, 8, 10]
Enum.any?(lista, fn x -> rem(x, 2) == 0 end)
 lista = ["apple", "pear", "fig", "banana"]
Enum.group_by(lista, fn x -> String.length(x) end)
tuplas = [{1, "one"}, {2, "two"}, {3, "three"}]
Enum.map(tuplas, fn x -> 
  x
    |> Tuple.to_list()
    |> Enum.join(" - ")
  end)
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
lista 
   |> Enum.filter(fn x -> rem(x, 2) == 1 end)
   |> Enum.sum() 
lista = ["Hello", "World", "From", "Elixir"]
Enum.join(lista, " ")
lista = [1, 2, 3, 1, 2, 4, 5]
Enum.uniq(lista)
lista = ["a", "b", "a", "c", "b", "a"]
Enum.frequencies(lista)
lista = ["apple", "banana", "kiwi", "grape"]
Enum.filter(lista, fn word -> String.length(word) == 5 end)
lista = [1, 2, 3, 4, 5]
Enum.map(lista, fn x ->
  if rem(x, 2) == 1 do
    x * 2
  else
    nil
  end
  end) |> Enum.filter(&amp; &amp;1)

Structs

map = %{a: 1, b: 2}
map[:a]
map2 = %{map | b: 5}
map
map2

Exemplo de Struct Pessoa.

defmodule Pessoa do
  defstruct nome: "Henrique", idade: 25
end
%Pessoa{}
%Pessoa{nome: "João"}
%Pessoa{peso: 100}

Atribuindo uma Struct a uma variável

joao = %Pessoa{nome: "João"}

Acessando um campo de uma struct

joao.nome
joao.idade

“Modificando” uma struct com |

maria = %{joao | nome: "Maria"}
maria = %{joao | peso: 45}

Uso de Structs no casamento de padrões

%Pessoa{nome: nome_do_maria} = maria
nome_do_maria

Structs são bare maps (mapas simples)

is_map(joao)

O campo especial Struct:

joao.__struct__
jane = Map.put(%Pessoa{}, :nome, "Jane")
Map.merge(jane, %Pessoa{nome: "John"})
Map.keys(jane)

Valores padrões

defmodule Produto do
  defstruct [:nome]
end
%Produto{}

Você pode combinar valores padrão explícito com valor ‘nil’ implícito

defmodule Usuario do
  defstruct [:email, nome: "João", idade: 23]
end
%Usuario{}

Definindo chaves obrigatórias

defmodule Car do
  @enforce_keys [:make]
  defstruct [:model, :make]
end
%Car{}
%Car{make: "toyota"}
%Car{make: "toyota", model: "HILUX"}

Construtores, Redutores e Conversores

defmodule JogoDaVelha do
  defstruct [:tabuleiro, :jogadores, :jogador_da_vez, :vencedor]

  def new(jogador1, jogador2) do
    %__MODULE__{
      tabuleiro: ["", "", "", "", "", "", "", "", ""],
      jogadores: [jogador1, jogador2],
      jogador_da_vez: jogador1
    }
  end

  def joga(jogo, simbolo, x, y) do
    novo_tabuleiro = List.insert_at(jogo.tabuleiro, x - 1 + (y - 1) * 3, simbolo)
    [novo_jogador_da_vez] = jogo.jogadores -- [jogo.jogador_da_vez]
    %{jogo | tabuleiro: novo_tabuleiro, jogador_da_vez: novo_jogador_da_vez}
  end

  def jogador_da_vez(jogo) do
    jogo.jogador_da_vez
  end
  
end

Structs

defmodule Estudante do
  
  defstruct [:id, :nome, :idade, :matricula, :curso]

  def new(nome, idade, matricula, curso) do
    case verificar_idade(idade) do
      {:ok, idade} -> 
        %Estudante{
            id: :erlang.unique_integer([:positive]),
           nome: nome,
           idade: idade,
            matricula: matricula,
           curso: curso
        }
      {:error, _} -> "idade menor"
      _ -> "não tem idade"
    end
    
  end

  def add_estudante(estudantes, estudante) do
    [estudante | estudantes]
  end

  def delete_estudante(estudantes, matricula) do
    Enum.filter(estudantes, fn estudante -> estudante.matricula != matricula end)
  end

  def update_estudante(estudantes, matricula, novos_dados) do
    Enum.map(estudantes, fn estudante 
      when estudante.matricula == matricula ->
      Map.merge(estudante, novos_dados)
    estudante -> 
      estudante
      end)    
  end

  def imprimir_estudantes_cadastrados(estudantes) do
    Enum.map(estudantes, fn estudante -> estudante.nome end)
  end

  def listar_estudantes_por_curso(estudantes, curso) do
    Enum.filter(estudantes, fn estudante -> estudante.curso == curso end)
  end

  defp verificar_idade(idade) do
    if idade > 18 do
      {:ok, idade}
    else
      {:error, "digite uma idade maior que 18"}
    end
  end
end
estudantes = []
estudante1 = Estudante.new("Marcus", 19, 11111, "Engenharia de software")
estudante2 = Estudante.new("Sarah", 25, 12352, "Engenharia de software")
estudantes = Estudante.add_estudante(estudantes, estudante1)
estudantes = Estudante.add_estudante(estudantes, estudante2)
IO.inspect(estudantes, label: "Estudantes cadastrados")
estudantes = Estudante.delete_estudante(estudantes, 12352)
Estudante.imprimir_estudantes_cadastrados(estudantes)
IO.inspect(estudantes)
estudantes = Estudante.add_estudante(estudantes, estudante2)
Estudante.listar_estudantes_por_curso(estudantes, "Engenharia de software")