= Variante 1 - Prodotti estendibili = === Introduzione === * una sorta di framework per lo sviluppo di linguaggi a partire da MiniScheme * prodotti aggiungibili a run-time come a tempo di compilazione -> (prototype factory and old factory) under template factory * unica interfaccia esposta al cliente per la creazione dei prodotti * riduzione del consumo di memoria: singleton per il factory manager (non per il prototype, cosi il cliente ...) cosiccome per l'old-factory. * facilitazione della configurazione dei prodotti al solo tempo di costruzione: ai vari metodi create e' sempre passata una lista di argomenti. Per quanto concerne la necessita' di configurare i prototipi sara' il cliente stesso a provvedere ridefinendo il metodo create della prototype factory. = Variante 2 - Operazioni estendibili = === Introduzione === * una sorta di framework per lo sviluppo di interpreti per il linguaggio Minischeme * estendibilita' delle operazioni -> rendere indipendente il modello dalle relative operazioni (attaccare il concetto di incapsulamento fra dati e operazioni, croce e delizia del paradigma a oggetti) -> mezzi utilizzati: esternare ogni algoritmo dal modello e dove possibile, rendere le operazioni modualari == Modello == * numero di costrutti non soggetto a cambiamenti -> factory under singleton * le api di manipolazione permettono al visitor l'attraversamento dell'albero * (albero eterogeneo && obiettivi di iterazione e visita polimorfica) -> aggiunta di `Entity` per permettere al cliente completa liberta' sebbene all'`Interpreter` interessino solo `Expression` (e ` Definition`?) * implementazioni di default come per `Value` * api di manipolazione generica implementate con enumerazioni invece che con index per aumentare la tipizzazione == Visitor == * la visita e' gestita in maniera autonoma dal visitor, che restituisce il controllo soltanto una volta terminato per intero la visita * uso di campi interni per permettere il passaggio dell'ambiente di valutazione (un'informazione indispensabile) * metodo `visit()` overloaded in modo da demandare alla vm la selezione dei metodi nel caso si voglia trattare con `Entity` == Iterator == * iterator esterni il cliente ha in mano il controllo dell'iterazione * l'algoritmo di attraversamento risiede all'interno dell'iterator e non all'interno del modello per perseguire l'estendibilita' delle operazioni richieste * modularizzato in `ModelIterator` (iteratore sull'intero modello) ed `EntityIterator` (iteratore sui figli di una entita')