Equipe: Fernando Calheiros Flavia Leite Eduardo Wagner Renata Bezerra Avaliação Parcial de Funções
Relembrando PartialInstatiatorVisitor Faz a avaliação parcial de funções Não é propriamente um Visitor No padrão visitor cada classe sabe se visitar, recebendo o visitor em um método visit PartialInstatiatorVisitor utiliza reflexão para determinar qual método visit dele mesmo deve ser chamado, deixando a estrutura original intocada
Novo Visitor Não copiar código Utilizar o padrão visitor Reutilizar as classes existentes
Problema
Funções parciais let fun add x = fn y. x + y in let var id = add(0) in id(1) Avaliação parcial de add(0): fn y. 0 + y fn y. y
Avaliação parcial Praticamente todas as classes foram copiadas para LF2 avaliar() não deve retornar Valor Nova assinatura: Expressao avaliar(AmbienteExecucao amb) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException; Todas as classes que estendem Expressao foram modificadas
Avaliação parcial de expressões Soma Avalia-se o lado esquerdo e o lado direito da soma Caso feliz: Ambos são inteiros, retornar um ValorInteiro com a soma dos dois O que acontece quando não consigo avaliar x + 0 no exemplo mostrado anteriormente? Retorna-se uma nova ExpSoma com os lados esquerdo e direito avaliados parcialmente (sendo possível que um esteja avaliado completamente) Pelo menos um dos lados foi avaliado parcialmente
Mudança no Ambiente ContextoExecucao agora é parametrizado com Expressao, ao invés de Valor Ids podem ser associados a expressões parcialmente avaliadas Não apenas ValorFuncao parcialmente avaliado! Tudo pode ser parcialmente avaliado agora
Avaliação de Id Procura no contexto Id não encontrado Avaliação falha Id encontrado Com Expressao Retorna a expressao Sem expressao Retorna o próprio Id
Avaliação de ValorFuncao Coloca no ambiente os ids dos parâmetros Caso o resultado da avaliação seja um valor concreto Retorna o valor obtido Se não... Retorna um novo ValorFuncao com a expressão parcialmente avaliada
Melhores resultados Retorna funções mais bem avaliadas Especialmente com composição de funções Nem sempre! Não reduz as operações binárias ao menor valor possível