1 / 13

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

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.

steven-wall
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. PLP – VarargsAdauto Trigueiro de A. Filho Emanoel BarreirosHelaine Lins

  2. 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.

  3. O Problema [2] • Exemplo: • let fun soma a b = a + b in soma(1,2)

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

  5. 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.

  6. 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.

  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; }

  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.

  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

  10. BNF ExpBinaria ::= 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

  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

  12. 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]]

  13. Dúvidas

More Related