Criando seu primeiro módulo Erlang
Tags: erlang, elixir, programacao
Published: 2021-02-24 13:59:03

Oi, pessoas programadoras! 

[Ontem falei sobre Erlang](https://dev.to/elixir_utfpr/ame-o-erlang-se-voce-ama-o-elixir-2n9d) e hoje eu vou ensinar como criar seu primeiro módulo em Erlang.

E o que é um módulo? É um conjunto de funções. OK, e o que é uma função? Uma função é um trecho de código, com um nome, que recebe zero ou mais argumentos e retorna um valor. Muito abstrato? Vamos a um exemplo.

A obesidade é um problema de saúde muito sério. Uma das formas de dizer se uma pessoa está obesa ou não é calculando seu Índice de Massa Corpórea (IMC). O cálculo é feito da seguinte forma:
- entrada: peso (em quilogramas) e altura (em metros)
- saída: um número real, normalmente superior a 15.

O cálculo é feito da seguinte forma: divide-se peso pelo quadrado da altura.

Antes uma observação: eu vou escrever os nomes de módulos, funções e variáveis em inglês. O nome do módulo vai ser `obesity`, que é obesidade em inglês. E o nome da função vai ser `calculate_bmi/2`, onde BMI é abreviação de *body mass index*, que é índice de massa corpórea em inglês. E este `/2`? Este `/2`faz parte do nome da função e diz que a função recebe dois argumentos. Ou seja: eu posso ter outras funções `calculate_bmi` com mais ou menos argumentos do que 2 (nãi veremos isto hoje).

Vamos então criar um arquivo chamado `obesity.erl` com o seguinte conteúdo:

```erlang
-module(obesity).

-export([calculate_bmi/2]).

calculate_bmi(Weight, Height) ->
    Weight / (Height * Height).
```

A linha "`-module(obesity).`" diz que o nome do módulo é `obesity`.

A linha "`-export([calculate_bmi/2]).`" diz que o módulo `obesity` exporta a função `calculate_bmi/2`.

As linhas:
```erlang
calculate_bmi(Weight, Height) ->
    Weight / (Height * Height).
```
definem a função `calculate_bmi` que recebe os argumento `Weight` e `Height`. *Weight* é peso em inglês, *Height* é altura em inglês. E a expressão `Weight / (Height * Height)` apenas faz o que dissemos acima: divide peso pelo quadrado da altura. Atenção para os pontos no fim de cada comando e para a letra  inicial maiúscula nos nomes dos argumentos.

OK, salve o arquivo e abra um *shell* de Erlang (erl) na pasta onde está seu arquivo:

```
$ erl
Erlang/OTP 23 [erts-11.1.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Eshell V11.1.1  (abort with ^G)
1>  
```

No *shell*, carregue o módulo `obesity` digitando `c(obesity).`:
```
1> c(obesity).
{ok,obesity}
```
Observe o retorno da função [`c/1`](https://erlang.org/doc/man/c.html#c-1): `{ok,obesity}`. Aqui, `ok`  e `obesity` são átomos e `{ok,obesity}` é uma tupla contendo estes dois átomos. Esta tupla informa que deu tudo certo com o carregamento do módulo `obesity`. Se o nome de módulo passado não existisse, `c/1` retornaria um erro, como aqui:
```
2> c(blablabla).
{error,non_existing}
```

Como chamo a função `calculate_bmi/2`? No *erl* digite o nome do módulo, seguido de dois pontos (:), seguido do nome da função e, entre parênteses, os valores passados como argumentos. Não esqueça do ponto final!

```
3> obesity:calculate_bmi(80, 1.75).
26.122448979591837
```

Funcionou. O IMC de uma pessoa que pesa 80Kg e mede 1,75m de altura é 26,122448979591837. Repare na questão de que nós, no Brasil, separamos casas decimais com vírgulas. Em vários outros países, a separação é com ponto.

Para sair do *erl*, basta digitar Control-C duas vezes.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kn24iwxnvp5srjb6e4ry.jpeg)

Que achou? O que você gostaria de aprender a fazer com Erlang?