Programação sequencial

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:

Funções definidas pelo programador não podem ser usadas como guards.

Exemplo:

factorial(0) -> 1;
factorial(N) when N > 0 ->
    N * factorial(N - 1).

A palavra reservada when introduz um guard. Cláusulas protegidas com guards podem ser reordenadas.

factorial(N) when N > 0 ->
    N * factorial(N - 1);
factorial(0) -> 1.

Atenção: Não é o mesmo que o seguinte exemplo incorrecto

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)


Exercícios

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: