Começando no Erlang

Olá, sou o mais novo membro do Pognation (vulgo blog do Stallone xD) e vou começar a postar sobre minhas experiências malucas com linguagens, começando com ERLANG.

Segundo o sagrado Wikipedia, Erlang é uma linguagem de programação concorrente e funcional, dinâmicamente tipada. Originalmente desenvolvida pela Ericsson, liberada como opensource em 1998.

O paradigma funcional (Haskell, OCaml, F#, só para citar alguns outros exemplos) é difícil de “digerir” para o desenvolvedor acostumado somente com Orientação a Objetos (no meu caso, Delphi, Ruby, C#, Java, Python). Mas como acredito que aprender uma linguagem nova me torna melhor em outras (know your enemy! Brincadeirinha ^^), vamos matar esse leão!

Ah, estou no Archlinux, então se virem para instalar o Erlang em suas distros favoritas :P

01 – Instaladno o Erlang

# pacman -S erlang

Assim teremos o ambiente Erlang instalado e sua shell, o erl.

Abra a shell do Erlang:

$ erl
<em>Erlang (BEAM) emulator version 5.6.3  [smp:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.3  (abort with ^G)
1>

Vamos brincar com a calculadora:

1> 4*4.
<em>16
2>

OBS.: Nunca se esqueça do ponto(.) no final da expressão!

Ficar mofando no shell é maçante, então vamos criar um programa de exemplo (feche o erl com CTRL + C, depois A):

Abra seu editor favorito e crie o arquivo exemplo.erl com este conteúdo:

-module(exemplo).
-export([double/1]).
double(X) -> 2*X.

Programação funcional é meio estranha, mas não é difícil entender que este programa dobra o valor de um número.

Agora abra o erl novamente, na mesma pasta do programa de teste e compile-o:

1> c(exemplo).
<em>{ok,exemplo}

E agora veja o resultado chamando o nosso “programa”:

2> exemplo:double(10).
<em>20
3>

Agora vamos explicar algumas coisas neste programa:

-module(exemplo).

Programas Erlang são criados em arquivos de texto com a extensão .erl, e o nome do arquivo deve ser igual ao nome do módulo(uma convenção semelhante ao Java). Quando usamos uma função em outro módulo, a sintaxe padrão é nome_do_módulo:nome_da_função(argumentos). Por isso temos:

2> exemplo:double(10).

A segunda linha do programa nos informa que o módulo exemplo contém uma função chamada double que recebe um argumento(X em nosso exemplo) e que esta função pode ser chamada fora do módulo exemplo(algo como encapsulamento público):

-export([double/1]).

Tudo bem até aqui, certo? Respirem fundo para o exemplo clássico de programa que calcula o fatorial de um número:

fatorial.erl
<em>-module(fatorial).
-export([fac/1]).
fac(1) -> 1;
fac(N) -> N * fac(N - 1).

Compile o programa no erl:

1> c(fatorial).
<em>{ok,fatorial}

E faça um teste calculando o fatorial de 4:

2> fatorial:fac(4).
<em>24

Agora vamos às explicações:

A primeira linha de código da função:

fac(1) -> 1;

Nos diz que o fatorial de 1 é 1, e o “;” indica que há mais “exemplos” desta função.

Na segunda e última linha:

fac(N) -> N * fac(N-1).

Utilizamos a recursividade para calcular o fatorial do argumento que será passado à função, aliás, acostumem-se com isso, pois loops são todos feitos assim no Erlang! *head explodes*

Esse foi o primeiro de uma série de posts sobre minhas aventuras no paradigma funcional, estou aprendendo ainda, mas espero poder dividir isto com a galera esperta que frequenta o blog :)