![Page 1: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/1.jpg)
1
PLP – VarargsAdauto Trigueiro de A. Filho
Emanoel BarreirosHelaine Lins
![Page 2: 1 PLP – Varargs Adauto Trigueiro de A. Filho Emanoel Barreiros Helaine Lins](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022070311/552fc144497959413d8e068c/html5/thumbnails/13.jpg)
Dúvidas