100 likes | 233 Views
Removendo PartialInstantiatorVisitor. Equipe: Fernando Calheiros ( fhcl@cin.ufpe.br ) Flavia Leite ( fls@cin.ufpe.br ) Eduardo Wagner ( ewma@cin.ufpe.br ) Renata Bezerra ( rbsa@cin.ufpe.br ). Interpreter.
E N D
Removendo PartialInstantiatorVisitor Equipe: Fernando Calheiros (fhcl@cin.ufpe.br) Flavia Leite (fls@cin.ufpe.br) Eduardo Wagner (ewma@cin.ufpe.br) Renata Bezerra (rbsa@cin.ufpe.br)
Interpreter • O padrão Interpreter é usado quando se quer construir um interpretador para uma linguagem • É recomendado para implementar linguagens simples • Vantagens • Representar cada regra da gramática em uma classe torna a linguagem mais fácil de implementar • Como a gramática é representada por classes, é possível mudar ou estender facilmente a linguagem • Ao adicionar novos métodos na estrutura de classes, pode-se ter novos comportamentos além da interpretação, como uma validação mais sofisticada do programa
Interpreter • Uso e Desvantagens • É apropriado quando você tem uma gramática simples e simplicidade é mais importante do que eficiência • Usado para linguagens de script e de programação • Esse padrão pode se tornar difícil quando o número de regras da gramática é grande • Nesses casos um gerador de parser/compilador pode ser mais apropriado
Visitor • O padrão Visitor é usado quando se quer adicionar funcionalidades a uma composição de objetos e encapsulamento não é importante • Vantagens • Permite adicionar operações a uma estrutura composta sem mudar a estrutura em si • Adicionar novas operações é relativamente fácil • O código das operações realizadas pelo Visitor é centralizado
Visitor • Desvantagens • O encapsulamento das classes compostas é quebrado quando o Visitor é usado • Como uma função de travessia está envolvida, mudanças à estrutura se tornam mais difíceis
Por que usar Visitor? • Visitor permite a separação do algoritmo da estrutura sobre a qual ele opera • Código fica centralizado
PartialInstatiatorVisitor • 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
ValorFuncao • avaliar() usa o visitor
Funções parciais (o problema) • let fun add x = fn y . x + y in • let var id = add(0), var x = 4 in id(1) • Por que esse código não é avaliado corretamente sem mudar a forma como as expressões são avaliadas?
Avaliação parcial • Atualmente métodos avaliar() não foram feitos pensando em avaliação parcial • É um concern crosscuting! • Retornam Valor, não Expressao • PartialInstatiatorVisitor • Implementa avaliação parcial através de reescritas das expressões • Evita mudanças em praticamente todas as classes que herdam de Expressao