Índice
- Parte I – Introdução
- Parte II – Introdução (continuação)
- Parte III – Estrutura: Tipos de Dados
- Parte IV – Shell
Como eu tinha prometido, agora vou mostrar um pouco da estrutura dos códigos Erlang, começando pelos principais tipos de dados.
Antes de começar, gostaria que todos vissem esse vídeo que eu achei (muito interessante!):
Capítulo II
I. Tipos de dados
Em Erlang, qualquer tipo de dado é chamado de Termo.
Vejamos então os termos em Erlang:
- Números
Existem 2 tipos de números em Erlang: Inteiro e Ponto Flutuante, e além da notação convencional: 1, 2.5, existem mais 2 tipos de notação: $char e base#value.
O $char retorna a posição do char na tabela ASCII, exemplo:
$A é igual a 65
Enquanto o base#value, é o resultado do valor sobre a base especificada, por exemplo, se quiser saber o valor decimal de FF sobre a base 16 (hexadecimal), você pode fazer:
16#FF é igual a 255
- Strings
Strings são fechadas entre aspas duplas (“), mas elas propriamente ditas não são um tipo de dado em Erlang. Huh?
Sim, strings em Erlang nada mais são que uma lista de números contendo cada posição dos caracteres na tabela ASCII, ou seja, quando você usa:
X = "ola".
Na verdade esta fazendo a mesma coisa que:
X = [$o, $l, $a].
Que consequentemente torna-se [111, 108, 97]. Pois 111 é a posição do “o” na tabela ASCII, assim como 108 e 97 são as posições de “l” e “a“.
- Átomos
Não confunda com os átomos de química. Um átomo, é um tipo bem interessante em Erlang, assemelha-se aos símbolos do Ruby, mas a sua utilidade é um pouco diferente, veremos a frente como os átomos podem nos ajudar na construção de nossos programas.
Aspas simples podem ser utilizadas para criar átomos em Erlang. Note que átomos podem ser construídos sem aspas simples, quando eles iniciam em letras minúsculas e contém somente caracteres alfa-numéricos, incluindo @ e _.
Exemplos de átomos:
numero
numero_telefone
'Numero'
'numero telefone'
- Binários
Erlang possui suporte nativo a binários.
Binario = <<"abc">>.
<<V1:8, V2:16>> = Binario.
V1.
<<V3:8, V4:8>> = <<V2:16>>.
V3.
V4.
Compreendendo o exemplo:
O que o trecho de código acima faz, basicamente é, criar uma variável contendo um binário de 3 caracteres “a”, “b”, e “c”, ou seja, 24 bits. Atribuindo os 8 primeiros bits da variável Binario à variável V1 (agora contendo “a”) e os outros 16 bits à variável V2 (agora contendo “bc”). Após isso ele imprime V1 e cria mais duas variáveis: V3 e V4, contendo os outros 16 bits da variável Binario, 8 bits pra cada, ficando assim V3 com “b”, e V4 com “c”. Após isso, imprime V3 e V4.
Note que se você tentar executar o código acima, na hora de imprimir as variáveis V1, V3 e V4, serão impressos números, que são os referentes a cada letra na tabela ASCII, ao invés de imprimir a letra. Isso é uma característica de Erlang. Já expliquei isso no tópico Strings, veja lá novamente, caso tenha alguma dúvida.
Não entendeu o trecho de código? Não se preocupe, foi só um exemplo, e com o passar dos artigos você vai acabar compreendendo melhor o código.
- Fun
Fun é um objeto funcional, também pode ser reconhecido como uma função anônima. Um exemplo básico de um objeto Fun é:
Dobro = fun(X) -> X * 2 end.
Onde Dobro(2) imprimirá 4, e Dobro(3) imprimirá 6.
- Tuplas
Tuplas em Erlang servem para formar um tipo de dado que é formado por um conjunto de termos. Cada termo dentro de uma tupla é chamado de elemento. Por exemplo:
{centimetros, 10}.
{metros, 10}.
Aí esta uma das funcionalidades dos átomos, criamos duas tuplas, cada uma com 2 elementos. Uma contendo “10 centímetros” e outra contendo “10 metros”. Interessante não?
Tuplas também podem conter outras tuplas:
{"Fulano", 18, {agosto, 4}}.
Onde Fulano é o primeiro elemento da tupla e refere-se ao nome de uma pessoa (string), 18 é a idade (número), agosto é o mês de nascimento (átomo) e 4 é o dia (número).
- Listas
Listas em Erlang lembram os vetores (arrays) de outras linguagens. Em uma lista, você pode ter qualquer tipo de dado, inclusive tuplas e outras listas.
[1, 2, [1, 2]].
Uma lista pode ser vazia ([]), ou conter um Head (cabeça) e um Tail (rabo). Aqui vou utilizar os termos Head e Tail pois ficará mais fácil para futuros estudos, já que são os termos mais utilizados.
Uma lista com Head e Tail, basicamente seria assim:
[1, 2, 3].
Onde 1 é o Head, e [2, 3] o Tail.
E pra quê isso?
Imagine que você quer caminhar por uma lista imprimindo cada elemento, você cria uma função recebendo a lista, imprime o Head e repassa o Tail para essa mesma função, realizando assim o que chamamos de recursividade, vejamos:
passar_por_lista([H | T]) ->
H.
passar_por_lista(T).
No exemplo acima, criamos a função passar_por_lista que recebe uma lista como parâmetro, ou melhor dizendo, recebe o H (Head, cabeça) dessa lista, e o T (Tail, rabo). Em seguinda, imprime o Head, e passa o Tail para a mesma função.
Não tente executar o trecho de código acima, ainda, pois falta algumas coisas para vermos mais à frente (próxima parte).
- Boleano
Boleanos (TRUE e FALSE), em Erlang, nada mais são que átomos (viu como eles são úteis?). Quando realizada a operação 1 < 2, é retornado um átomo chamado true. Assim como 1 > 2 retorna um átomo false.
- Record
Um Record é uma estrutura de dados para armazenamento de um número fixo de elementos. É composto de campos nomeados, e lembra o struct da linguagem C.
O Record não é um tipo de dado verdadeiro, na verdade, na hora da compilação ele é transformado em tuplas. Sendo assim, os Record’s não podem ser testados através da shell (erl), pois só existem para o compilador. Então para testa-los é necessário criar um arquivo e compila-lo.
Um exemplo básico de Record (não deve ser compilado) é o abaixo:
% pessoa, nome e idade são átomos
-record(pessoa, {nome, idade}).
% Nome e Idade são variáveis
new(Nome, Idade) ->
% name é átomo, Name se refere à variável
% idade é átomo, Idade se refere à variável
#pessoa{name=Name, idade=Idade}.
Caso compilássemos, poderiamos utilizar o Record da seguinte forma na shell:
pessoa:new(fulano, 44).
E ele retornaria à nós uma tupla:
{pessoa, fulano, 44}.
Conclusão
Bom, realmente essa parte foi um pouco cansativa de fazer, mas o aprendizado vale a pena. Agora vou descansar um pouco, ler mais sobre Erlang depois e começar a escrever a Parte 4.
Espero que tenha sido esclarecedor até aqui, caso tenha cometido algum erro, ou tenha alguma parte que esteja difícil entender, por favor, comentem. Prometo que tento melhorar “a coisa”. :)
Este documento esta sob licença GFDL – GNU Free Documentation License. Saiba mais.
[...] Wordpress Posts RecentesAprendendo Erlang – Parte III [...]
[...] Wordpress Posts RecentesAprendendo Erlang – Parte III [...]
Acharia mais interessante (ou, mais prático) se houvessem exemplos que pudessem ser compilados. Talvez, ainda seja cedo, mesmo assim, estou gostando muito dos posts.
Parabéns pela iniciativa e obrigado. =)
Oi, parabéns pelo tutorial. Gostaria apenas de sugerir que, já que estamos tratando de uma linguagem funcional, fosse informado que a função anônima tem um nome bastante específico nesse paradigma, que é a função lambda. A função lambda é oriunda do cálculo lambda, esse sim constituindo a base matemática da programação funcional e trabalhando com reduções de termos. :-)
[]’s
Se strings são seqüências de endereços para a tabela ASCII, como são tratadas strings Unicode em Erlang? Não há suporte nativo?
@LKRaider
Por Erlang armazenar todas as strings como sequências de números inteiros, ele suporta sim Unicode, pois ele simplesmente mapeia os caracteres Unicode em inteiros.
1> {ok, FP} = file:open(teste.txt, [raw, append]). 2> file:write(FP, \303\251). 3> file:close(FP).Porem temos um problema. Esse suporte é muito básico. Por exemplo, caso queira trabalhar as funções do módulo string com strings Unicode, você terá problemas.
Existe uma proposta para melhorar esse suporte a Unicode em Erlang, que inclusive já foi aceito:
http://www.erlang.org/eeps/eep-0010.html
E como uma alternativa à isso, no momento temos o módulo Starling (ustring) que ajuda nesse suporte.
http://code.google.com/p/starling/
[...] Aprendendo Erlang – Parte III [...]