Projeto II - PLP Prof. Augusto Sampaio Implementar Avaliação Preguiçosa e Casamento de Padrões em Linguagem Funcional II Projeto II - PLP Prof. Augusto Sampaio Equipe : Aliny Figueirêdo Meira Ana Cristina Freitas César Danuza Ferreira Santana Neiva Mario Godoy Neto
Agenda Projeto 2.1 – Avaliação Preguiçosa Contexto Classes Implementadas Exemplos Projeto 2.2 – Casamento de Padrões Dificuldades Encontradas BNF Referências
Avaliação Preguiçosa ( Lazy Evaluation) Contexto Definição : Avaliação dos argumentos de uma função somente no momento em que forem utilizados pela primeira vez. Aplica imediatamente a função ao argumento, adiando para mais tarde a avaliação desse argumento. Diferenças: Eager Lazy: (fun x -> x+1)(2+3) = (fun x -> x+1)5 = 5+1 = 6 (fun x -> x+1)(2+3) = (2+3)+1 = 5+1 = 6
Avaliação Preguiçosa ( Lazy Evaluation) Contexto Linguagens que adotam a estratégia: Eager: Pascal, C, Java, OCaml Lazy: Haskell Problema que ocorreria no Eager não ocrre na Lazy: let var a = 1/0 in 2
Avaliação Preguiçosa ( Lazy Evaluation) Contexto Poder da Avaliação Preguiçosa let fun loop x = loop(x), fun f x = 5 in f(loop(3)) (Na Eager não funcionaria - ficaria em loop )
Avaliação Preguiçosa Classe Implementadas/Alteradas Interface AmbienteExecucaoLazy (nova) Classe ContextoExecucaoLazy (nova) Classe ID (alterada) Interface Expressao (alterada) Classe ExpDeclaracao (alterada) Classe StackHandler (alterada) Classe Aplicacao (alterada) Implementação no Projeto
Avaliação Preguiçosa Classe Implementadas/Alteradas Interface AmbienteExecucaoLazy - Guarda mapeamento de ID em Expressões - classes que implementam EXPRESSAO recebem AmbienteExecuçãoLazy - AtualizaId(), altera a Expressao associada ao primeiro ID que case com o valor de idArg na pilha de escopos.
Avaliação Preguiçosa Classe Implementadas/Alteradas Classe ContextoExecucaoLazy (nova) - public void atualizaId(Id idArg, expressao expId) Invoca o método updateId (StackHandler); - public Expressao get(Id idArg) Recupera a expressao mapeada no idArg; - public void map (Id idArg, Expressao expId) O ambiente guarda o mapeamento dos Identificadores (classe Id) nas Expressoes (Interface Expressao).
Avaliação Preguiçosa Classe Implementadas/Alteradas Classe Id (cód) - Metodo AVALIAR: Avalia se o ID é valor ou expressão. Se for VALOR, retorna o valor. Se for EXPRESSAO, avalia e atualiza o ID (diferente da LF2). A expressão associada ao Id só é avaliada 1 vez.
Avaliação Preguiçosa Classe Implementadas/Alteradas classe ExpDeclaracao (cód) - Metodos includeBinding - Metodos resolveBinding Tratam do mapeamento do Id como expressão e não mais como valor
Avaliação Preguiçosa Classe Implementadas/Alteradas Classe StackHandler e Classe Aplicacao Problema da Recursividade Problemas nos identificadores Resolução: foi necessário buscar a próxima ocorrência do id , até alcançar o id com o valor associado do mesmo. Substituição do Id em todas as expressões do contexto (mesmo Map) Exemplo: let var n = 1 in let fun imprime l n = (if n == 6 then l else imprime ((n cons l), (n+1) )) in imprime ([], n)
Casamento de Padrão (Pattern Matching) Contexto Definição É o ato de verificação da presença de um padrão em um conjunto de dados Exemplo let [fun fib 0 = 1 | fib 1 = 1 | fib n = fib (n - 1) + fib (n -2) ] in fib (6)
Casamento de Padrão Dificuldades Encontradas Definição do escopo do Padrão Id e ValorConcreto Avaliação das condições Criação de um Ambiente de Execução local, cópia do ambiente original.
BNF A BNF foi estendida de forma a permitir que declarações de funções possam ser escritas da seguinte forma: fun f padrao_1 = exp_1,[ if cond_1] | ... | f padrao_n = exp_n, [if cond_n]
Casamento de Padrão Classe Implementadas/Alteradas Classe DecFuncao (alterada) Classe Aplicacao (alterada) Classe ValorFuncaoPadrao (Criada) Classe Padrao (Criada) Classe ValorPadrao (Criada) Classe ExpMaior (Criada) Classe ExpMenor (Criada) Implementação no Projeto
Classe DecFuncao public DecFuncao(Id idFun, ValorFuncaoPadrao valorFuncP) { this.id = idFun; this.valorFuncP = valorFuncP; }
Casamento de Padrão Exemplos [1] let var x = 1 in let [fun f 0 = 0 | f n = n + f(n - 1) , if x > 0] in f(2 + 3)
Agradecimento Marcus Vinícius
Referências WATT, David A. Programming Language Concepts and Paradigms, 2004 Haskell reference. Disponível em: http://www.zvon.org/other/haskell/Outputsyntax/index.html. Último Acesso: 20 de junho de 2007. Dias, A. Linguagens e Técnicas de Programação Avançadas. Disponível em: http://ctp.di.fct.unl.pt/~amd/ltpa/teoricas/02.html Último Acesso: 07 de agosto de 2007.