Guards
Guards são condições que têm de ser satisfeitas antes da
cláusula de uma função ser escolhida. Podem ser vistos como uma
extensão
do pattern matching. Um guard pode ser apenas um teste
ou
uma sequência de testes separados por vírgulas (operador lógico and) ou
pontos e vírgulas (operador lógico or) .
Um teste pode ser uma:
factorial(0) -> 1;
factorial(N) when N > 0 ->
N * factorial(N - 1).
factorial(N) when N > 0 ->
N * factorial(N - 1);
factorial(0) -> 1.
factorial(N) ->
N * factorial(N - 1);
factorial(0) -> 1.
Lista de BIFs que podem ser usadas
como guards
is_atom/1 |
is_binary/1 |
is_constant/1 |
is_list/1 |
is_float |
is_function/1 |
is_integer/1 |
is_number/1 |
is_pid/1 |
is_port/1 |
is_reference/1 |
is_record/1 |
Cada uma destas BIFs tem uma equivalente mais antiga, sem o prefixo
is_. Só são mantidas por razões de retrocompatibilidade.
element(N,Tuplo) | abs(Number) | hd(List) |
length(List) |
node(Pid | Ref | Port) | node() | round(Number) |
self() |
size(Tuple | Binary) | tl(List) | trunc(Number) |
Exemplo:
primos(15).
Lista inicial : [2,3,4,5,6,7,8,9,10,11,12,13,14,15].
1º passo : [2,3,5,7,9,11,13,15].
2º passo : [2,3,5,7,11,13].
Tuplos
Os tuplos permitem agrupar diversos tipos de objectos possibilitando
a construção de novos objectos complexos. Cada termo de um tuplo é
designado por elemento. O
objecto {e1,e2,e3,..,en} é um tuplo de tamanho n. Os tuplos são usados
para estruturas de dados com um número fixo de elementos. Estruturas de
dados com um número variável de elementos devem ser guardadas em
listas, como vimos na aula anterior.
Existem algumas BIFs para manipular tuplos. Exemplos:
1> T = {joao,24,{12,julho}}.
{joao,24,{12,julho}}
2> element(1,T).
joao
3> element(3,T).
{12,julho}
4> T2 = setelement(2,T,25).
{joao,25,{12,julho}}
5> size(T2).
3
Exercícios
Implemente as seguintes funções: