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

October 17th, 2023

2023_10_17.livemd

October 17th, 2023

Functions in Elixir

defmodule Math do
  def identity(x) do
    x
  end

  def largest(num1, num2) do
    if num1 > num2 do
      num1
    else
      num2
    end
  end

  #  def smallest(num1, num2) when largest(num1, num2)==num1, do: num2
  #  def smallest(num1, num2) when largest(num1, num2)==num2, do: num1

  # guard 
  def smallest(num1, num2) when num1 < num2, do: num1
  def smallest(_, num2), do: num2
end
Math.smallest(100, 100)
Math.smallest(200, 100)
Math.smallest(100, 200)
Math.largest(100, 200)
Math.largest(200, 100)
Math.largest(200, 200)
Math.identity(67)

Gabriel Shimosaka

Create a module called BMI that receives someones height and weight and calculates a person’s BMI.

defmodule BMI do
  def compute(height, weight) do
    weight / (height * height)
  end
end
BMI.compute(1.75, 75)

Data Structures

  • List
  • Tuple

Lists

# A list in LISP is (1 3 5)
# LISP = List Processing

[1, 3, 5]
  • Integers
  • Floating point numbers
  • Strings
  • Atoms
  • Booleans
[1, 20.0, "third", :atomic, true]
[67, "hkjsdhkadsjh", [1, 20.0, "third", :atomic, true], [1, [3]]]

Tuples

{1, 3, 5}
{1.75, :meters}
{175, :centimeters}
{75, :kilograms}
Enum.shuffle(1..25)

Pattern Matching (=)

1 == 2
1 = 2
x
x = 5
x
x == 5
1 = 1
5 = x
y
6 = y
y = 6
Y = 6
height = 175
{height, weight} = {175, 75}
height
weight
{"adolfo", height, "UTFPR", weight} = {"adolfo", 167, "UTFPR", 90}
height
# pin operator
{^height, :centimeters} = {180, :centimeters}
{^height, :centimeters} = {167, :centimeters}
height
{:name, name} = {:name, "Adolfo", :weight, 200}
{:name, name, _, _} = {:name, "Adolfo", :weight, 200}

Pattern Matching in Lists

a_list = [1, 3, 5]
head = hd(a_list)
tail = tl(a_list)
head
tail
[head | tail]
[head2 | tail2] = [42, :idontknow, "Curitiba", 455_567_565.888]
head2
tail2
[head3 | tail3] = [true]
head3
tail3
[head4 | tail4] = []
[_ | tail] = [1, 45345, 634, 54, 64]
tail
[_, _, 3, 56, game | tail] = [
  86786,
  908,
  3,
  56,
  "tic-tac-toe",
  "jogo da velha",
  "Dia de Los Muertos"
]
game
tail

Pattern Matching in Function Clauses

defmodule Person do
  def get_name({:name, name}), do: name
  def get_name({:nome, name}), do: name
  def get_name({:nombre, name}), do: name
end
Person.get_name({:name, "Adolfo"})
Person.get_name({:name, "Maria"})
Person.get_name({:nome, "Adolfo"})
Person.get_name({:nombre, "Adolfo"})
defmodule Find do
  def largest(a_list) when is_list(a_list) do
    largest(a_list, 0)
  end

  def largest(_), do: "!!! Wrong Argument !!! It should be a list !!!"

  defp largest([], largest_so_far), do: largest_so_far

  defp largest([head | tail], largest_so_far) do
    if head > largest_so_far do
      largest(tail, head)
    else
      largest(tail, largest_so_far)
    end
  end

  defp f(x), do: x + 10
  def f(x, y), do: f(x) * y
end
[head | tail] = [127, 11, 67, 87]
head
tail
Find.f(10)
Find.f(10, 9)
Find.largest(:afsghkjsfd)
Find.largest([127, 11, 67, 87])
Find.largest([])
is_list([])
Find.largest([-34, -78, -89])

Ricardo S. Alvares

defmodule BMI2 do
  def compute(height, weight) when is_number(height) and is_number(weight) do
    weight / (height * height)
  end

  def compute({height, :meters}, {weight, :kilograms}) do
    weight / (height * height)
  end

  def compute({height, :centimeters}, {weight, :kilograms}) do
    compute({height / 100, :meters}, {weight, :kilograms})
  end
end
BMI2.compute({1.75, :meters}, {75, :kilograms})
BMI2.compute({175, :centimeters}, {75, :kilograms})
BMI2.compute(1.75, 75)

New version of Find

defmodule Find2 do
  def largest([head | tail] = a_list) when is_list(a_list) do
    largest(tail, head)
  end

  def largest(_), do: {:error, "!!! Wrong Argument !!! It should be a non-empty list !!!"}

  defp largest([], largest_so_far), do: largest_so_far

  defp largest([head | tail], largest_so_far) do
    if head > largest_so_far do
      largest(tail, head)
    else
      largest(tail, largest_so_far)
    end
  end
end
Find2.largest([127, 178, 1167, 11116])
Find2.largest([-89, -98, -34, -12])
Find2.largest([])