13
1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

Embed Size (px)

Citation preview

Page 1: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

1

PLP – VarargsAdauto Trigueiro de A. Filho

Emanoel BarreirosHelaine Lins

Page 2: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

O Problema [1]

• Na linguagem funcional 3 o número de parâmetros passados a uma função é fixado no momento em que a mesma é criada e a sua chamada só pode ser feita com aquele número pré-determinado de parâmetros.

Page 3: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

O Problema [2]

• Exemplo:

• let fun soma a b = a + b in

soma(1,2)

Page 4: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

O Problema [3]

• A função anterior só recebe dois parâmetros. Se eu quiser uma que receba três, quatro, cinco, ...?

Page 5: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

A solução

• Implementar o conceito de VARARGS na LF3

• Com VARARGS, uma função/método pode ser criada com um parâmetro que recebe vários argumentos.

Page 6: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

VARARGS [1]

• Características:

– Uma vez chamada a função/método, a lista de parâmetros passada é imutável.

– O tamanho da lista não é definido.

– O VARARGS deve ser o último parâmetro da função/método.

Page 7: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

15/01/2007 7

Varargs [2]

Exemplo de VARARGS em Java:

public static double somar(double ... numeros ){

double soma = 0;

for (double n: numeros){

soma += n;}

return soma;

}

Page 8: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

15/01/2007 8

VARARGS em LF3

• Usa a implementação de listas da LF3.

• Pode conter diferentes tipos.

• É identificado por “...” antes do parâmetro.

• Dentro do corpo da função, todas as operações com listas são permitidas.

Page 9: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

15/01/2007 9

BNF

Programa ::= Expressao

Expressao ::= Valor | ExpUnaria | ExpBinaria | ExpDeclaracao | Id | Aplicacao | IfThenElse

Valor ::= ValorConcreto | ValorAbstrato

ValorAbstrato ::= ValorFuncao

ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ValorLista

ValorFuncao ::= "fn" Id Id "." Expressao

ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao | head(Expressao) | tail(Expressao) | size(Expressao) | ExpCompreensaoLista

ExpCompreensaoLista ::= Expressao Gerador | Expressao Gerador Filtro

Gerador ::= “for” Id “in” Expressao | “for” Id “in” Expressao [“,”] Gerador

Filtro ::= “if” Expressao

Page 10: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

BNFExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao

| Expressao "*" Expressao | Expressao ">" Expressao

| Expressao "<" Expressao | Expressao "and" Expressao

| Expressao "or" Expressao | Expressao "==" Expressao

| Expressao "++" Expressao | Expressao ".." Expressao

| Expressao ":" Expressao | Expressao "^^" Expressao

ExpDeclaracao ::= "let" DeclaracaoFuncional "in" Expressao

DeclaracaoFuncional ::= DecVariavel | DecFuncao

| DeclaracaoFuncional "," DeclaracaoFuncional

DecVariavel ::= "var" Id "=" Expressao

DecFuncao ::= "fun" ParamList "=" Expressao

ListId ::= Id | Id"," ListId

ParamList ::= ListId | ListId"," "..."VarargsId | "..."VarargsId

Aplicacao:= Expressao"(" ListExp ")”

ListExp ::= Expressao | Expressao, ListExp

Page 11: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

15/01/2007 11

Exemplos

let fun somaUm a = a + 1 in

let fun somaCinco b = b + 5 in

let fun comp valor ...funcoes =

(head(tail(funcoes)))((head(funcoes))(valor)) in

comp(2,somaUm, somaCinco)

Resultado: 8

Page 12: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

Exemplos

let fun heads ...listas = [head( x) for x in listas] in

heads([3,4,5],[1,7,8],[9,2,6])

Resultado: [3,1,9]

let fun heads ...listas =

[head( x) for x in listas] ^^ [tail( y) for y in listas]

in heads([3,4,5],[1,7,8],[9,2,6])

Resultado: [3, 1, 9, [4, 5], [7, 8], [2, 6]]

Page 13: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins

Dúvidas