Removendo PartialInstantiatorVisitor Equipe: Fernando Calheiros ([email protected]) Flavia Leite ([email protected]) Eduardo Wagner ([email protected]) Renata Bezerra ([email protected]) 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