Pattern matching
O que é? Onde vive?
Do que se alimenta? Como se reproduz?
por Dickson S. Guedes
v1.0
esta palestra foi prática e simulou um jogo
interagindo com os participantes…
faltou muito para ser uma palestra completa sobre
pattern matching…
uma segunda parte desta palestra pode ser
apresentada, aprofundando-se mais sobre diversas
estruturas de dados...
só depende de vocês :)
loading game...
LEVEL 1
solitário
preparem-se...
a
b
a
b
a
b
a
b
LEVEL 1
completed!
LEVEL 2
acompanhado
preparem-se...
a
b
c
a
b
c
a
b
c
LEVEL 2
completed!
LEVEL 3
abraçado
preparem-se...
a
b
c
a
b
c
“
“
b
g
c “
“
LEVEL 3
completed!
nutella mode
disabled!
LEVEL 4
Binary
String é um Binary
codificado em UTF-8
“...” = <<“...”>>
x = “a” # x é o binário a
x = “b” # x virou o binário b
^x = “c” # x é b que não casa com c
o que acontece?
preparem-se...
b
a
c “ola”
‘ola’
“olá”
<<“olá”>>
b
a
c <<“ola”>>
‘olá’
“olá”
<<“ol”, 225 :: utf8>>
referência ...
Em UTF-8:
“á” => LATIN SMALL LETTER A WITH ACUTE
Em HTML
“á” => &#225;
Em Elixir
“á” => <<225 :: utf8>>
LEVEL 4
completed!
LEVEL 5
recursivo
Para entender
recursividade você
precisa entender
recursividade
respirem...
lista são escritas assim:
lista = [1, 2, 3, 4, 5]
lista tem uma cabeça e uma calda, então
na lista acima
cabeça (ou head) é o número 1
calda (ou tail) é a lista [2, 3, 4, 5]
vendo de outro jeito head e tail:
[1, 2, 3, 4, 5]
na prática se eu faço:
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[ head | tail ] = lista
então:
head é 1 # apenas um número
tail é [2, 3, 4, 5, 6, 7, 8, 9, 0] # uma lista
vendo de outro jeito head e tail:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
lista = [1, 2, 3, 4, 5]
[ head | tail ] = lista
head é 1 e tail é [2, 3, 4, 5]
[ head | tail ] = tail
head é 2 e tail é [3, 4, 5]
[ head | tail ] = tail
head é 3 e tail é [4, 5]
[ head | tail ] = tail
head é 4 e tail é [5]
Para não
ter dúvida!
Se tail é [5], ao executar:
[ head | tail ] = tail
o que acontece?
Nada de erro, head é 5 e tail é []
Depois disto, ao executar:
[ head | tail ] = tail
o que acontece?
lista = [1, 2, 3, 4, 5]
[ head, second | tail ] = lista
head é ?
second é ?
tail é ?
Para não
ter dúvida
mesmo!
lista = [1, 2, 3, 4, 5]
[ head, second | tail ] = lista
head é 1
second é 2
tail é [3, 4, 5]
Para não
ter dúvida
mesmo!
Parabéns!
Você desbloqueou o
modo hands-on!
Foi neste ponto que eu cansei de fazer slides...
Usando o iex para testar a leitura da ID TAG de uma música MP3
iex(1)> musica = File.read!('musica.mp3')
<<73, 68, 51, 4, 0, 0, 0, 0, 8, 120, 84, 83, 83, 69, 0, 0, 0, 11,
0, 0, 3, 76, 97, 118, 102, 53, 54, 46, 49, 46, 48, 84, 73, 84,
50, 0, 0, 0, 26, 0, 0, 0, 73, 109, 97, 103, 105, 110, 101, 32,
...>>
iex(2)> tamanho = byte_size(musica) - 128
3543914
iex(3)> << audio :: bytes-size(tamanho), id3tag :: binary>> = musica
<<73, 68, 51, 4, 0, 0, 0, 0, 8, 120, 84, 83, 83, 69, 0, 0, 0, 11, 0, 0, 3,
76, 97, 118, 102, 53, 54, 46, 49, 46, 48, 84, 73, 84, 50, 0, 0, 0, 26, 0,
0, 0, 73, 109, 97, 103, 105, 110, 101, 32, ...>>
iex(4)> audio
<<73, 68, 51, 4, 0, 0, 0, 0, 8, 120, 84, 83, 83, 69, 0, 0, 0, 11, 0, 0, 3,
76, 97, 118, 102, 53, 54, 46, 49, 46, 48, 84, 73, 84, 50, 0, 0, 0, 26, 0,
0, 0, 73, 109, 97, 103, 105, 110, 101, 32, ...>>
iex(5)> id3tag
<<84, 65, 71, 73, 109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111,
110, 115, 32, 45, 32, 84, 104, 117, 110, 100, 101, 114, 0, 0, 0, 0, 0, 73,
109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111, 110, 115, 0, 0,
...>>
iex(6)> << header :: bytes-size(3),
titulo :: bytes-size(30),
rest :: binary >> = id3tag
<<84, 65, 71, 73, 109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111,
110, 115, 32, 45, 32, 84, 104, 117, 110, 100, 101, 114, 0, 0, 0, 0, 0, 73,
109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111, 110, 115, 0, 0,
...>>
iex(7)> header
"TAG"
iex(8)> titulo
"Imagine Dragons - Thunder"
LEVEL 5
completed!
Quer saber mais?
Deixe-me saber!
twitter.com/guediz

Pattern matching - O que é? Onde vive? Do que se alimenta? Como se reproduz?

  • 1.
    Pattern matching O queé? Onde vive? Do que se alimenta? Como se reproduz? por Dickson S. Guedes v1.0
  • 2.
    esta palestra foiprática e simulou um jogo interagindo com os participantes… faltou muito para ser uma palestra completa sobre pattern matching… uma segunda parte desta palestra pode ser apresentada, aprofundando-se mais sobre diversas estruturas de dados... só depende de vocês :)
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
    String é umBinary codificado em UTF-8 “...” = <<“...”>>
  • 26.
    x = “a”# x é o binário a x = “b” # x virou o binário b ^x = “c” # x é b que não casa com c o que acontece?
  • 27.
  • 28.
  • 29.
  • 30.
    Em UTF-8: “á” =>LATIN SMALL LETTER A WITH ACUTE Em HTML “á” => &#225; Em Elixir “á” => <<225 :: utf8>>
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
    lista são escritasassim: lista = [1, 2, 3, 4, 5] lista tem uma cabeça e uma calda, então na lista acima cabeça (ou head) é o número 1 calda (ou tail) é a lista [2, 3, 4, 5] vendo de outro jeito head e tail: [1, 2, 3, 4, 5]
  • 36.
    na prática seeu faço: lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] [ head | tail ] = lista então: head é 1 # apenas um número tail é [2, 3, 4, 5, 6, 7, 8, 9, 0] # uma lista vendo de outro jeito head e tail: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
  • 37.
    lista = [1,2, 3, 4, 5] [ head | tail ] = lista head é 1 e tail é [2, 3, 4, 5] [ head | tail ] = tail head é 2 e tail é [3, 4, 5] [ head | tail ] = tail head é 3 e tail é [4, 5] [ head | tail ] = tail head é 4 e tail é [5] Para não ter dúvida!
  • 38.
    Se tail é[5], ao executar: [ head | tail ] = tail o que acontece?
  • 39.
    Nada de erro,head é 5 e tail é [] Depois disto, ao executar: [ head | tail ] = tail o que acontece?
  • 40.
    lista = [1,2, 3, 4, 5] [ head, second | tail ] = lista head é ? second é ? tail é ? Para não ter dúvida mesmo!
  • 41.
    lista = [1,2, 3, 4, 5] [ head, second | tail ] = lista head é 1 second é 2 tail é [3, 4, 5] Para não ter dúvida mesmo!
  • 42.
    Parabéns! Você desbloqueou o modohands-on! Foi neste ponto que eu cansei de fazer slides...
  • 43.
    Usando o iexpara testar a leitura da ID TAG de uma música MP3 iex(1)> musica = File.read!('musica.mp3') <<73, 68, 51, 4, 0, 0, 0, 0, 8, 120, 84, 83, 83, 69, 0, 0, 0, 11, 0, 0, 3, 76, 97, 118, 102, 53, 54, 46, 49, 46, 48, 84, 73, 84, 50, 0, 0, 0, 26, 0, 0, 0, 73, 109, 97, 103, 105, 110, 101, 32, ...>> iex(2)> tamanho = byte_size(musica) - 128 3543914
  • 44.
    iex(3)> << audio:: bytes-size(tamanho), id3tag :: binary>> = musica <<73, 68, 51, 4, 0, 0, 0, 0, 8, 120, 84, 83, 83, 69, 0, 0, 0, 11, 0, 0, 3, 76, 97, 118, 102, 53, 54, 46, 49, 46, 48, 84, 73, 84, 50, 0, 0, 0, 26, 0, 0, 0, 73, 109, 97, 103, 105, 110, 101, 32, ...>> iex(4)> audio <<73, 68, 51, 4, 0, 0, 0, 0, 8, 120, 84, 83, 83, 69, 0, 0, 0, 11, 0, 0, 3, 76, 97, 118, 102, 53, 54, 46, 49, 46, 48, 84, 73, 84, 50, 0, 0, 0, 26, 0, 0, 0, 73, 109, 97, 103, 105, 110, 101, 32, ...>> iex(5)> id3tag <<84, 65, 71, 73, 109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111, 110, 115, 32, 45, 32, 84, 104, 117, 110, 100, 101, 114, 0, 0, 0, 0, 0, 73, 109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111, 110, 115, 0, 0, ...>>
  • 45.
    iex(6)> << header:: bytes-size(3), titulo :: bytes-size(30), rest :: binary >> = id3tag <<84, 65, 71, 73, 109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111, 110, 115, 32, 45, 32, 84, 104, 117, 110, 100, 101, 114, 0, 0, 0, 0, 0, 73, 109, 97, 103, 105, 110, 101, 32, 68, 114, 97, 103, 111, 110, 115, 0, 0, ...>> iex(7)> header "TAG" iex(8)> titulo "Imagine Dragons - Thunder"
  • 46.
  • 47.
    Quer saber mais? Deixe-mesaber! twitter.com/guediz