pietrotrope / OOL-extension

Object Oriented Lisp extension written in Lisp

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Tropeano Pietro 829757

=== ool.lisp ===

Object Oriented Lisp è un'estensione "object oriented" di lisp


=== Descrizione ===

Per lavorare con questa implementazione di ool fare riferimento alle
specifiche del progetto.
Per maggiori informazioni circa il funzionamento del codice leggere i paragrafi
seguenti, fino alla fine della sezione Descrizione.

Definizione di una classe:

	L'implementazione Lisp di ool prevede l'utilizzo di una hashtable
	come "memoria" dove salvare le classi nella forma:

	(<parents> <slot-values>)

	Utilizzando come chiave il nome della classe.

	<slot-values> è una lista nella forma:

	((key0 . value0) ... (keyN . valueN))
	
	Dove key rappresenta il nome dello slot o metodo, 
	value rappresenta il valore dello slot o la funzione anonima ricavata dal
	codice fornito in input.


Creazione di una istanza:

	Le istanze si creano grazie alla primitiva new, dopo aver verificato che
	esistano gli adeguati slot-name nella classe o nelle sue superclassi.
	
	L'istanza rispetta la forma:
	
	(<class-name> <slot-values>)
	
	Per fare riferimento ad una istanza è consigiato utilizzare la
	defparameter al momento della creazione.
	

Estrazione di un campo (o slot) da una classe:
	
	L'estrazione di un campo da una classe avviene grazie all'utilizzo
	della primitiva getv.
	
	La getv cerca il campo all'interno degli slot dell'istanza, se non
	lo trova lo cerca all'interno degli slot della classe e delle sue 
	superclassi seguendo una politica Depth-First.
	
	Se non viene trovato lo slot viene restituito un errore.


Estrazione di un campo percorrendo una catena di attributi:
	
	L'estrazione di un campo da una catena di attributi / slot avviene 
	grazie all'utilizzo della primitiva getvx.
	
	La getvx cerca il primo campo della lista all'interno dell'istanza passata
	e procede a cercare il successivo utilizzando l'istanza trovata per
	effettuare la nuova ricerca.
	Una volta raggiunto l'ultimo elemento della lista, esso viene restituito
	con una getv.
	
	Si può chiamare la getvx passando come argomenti una istanza e una lista o
	anche una istanza e una serie di parametri aggiuntivi che identificano i
	diversi slot da percorrere.
	
	Qualora non sia presente uno slot verrà restituito un errore.
	

Gestione dei metodi:
	
	La creazione dei metodi utilizzata per questa implementazione avviene
	grazie ad i seguenti step:
		
		1) Nel momento della definizione di una classe o di una istanza si
		   verifica che ogni slot sia occupato da un metodo o da un valore di
		   uno slot. Se lo slot contiene un metodo, si procede al punto 2.
		   
		2) Per lo slot trovato si procede ad inserire come valore il risultato
		   della chiamata di process-method con nome del metodo e codice 
		   insieme agli argomenti.
		   
		3) Process method si occupa di 3 cose:
		
			1) creare una funzione trampolino che richiama ed esegue il codice
			contenuto nello slot di uguale nome contenuto nell'istanza, passata
			come primo argomento.
			
			2) Associare alla funzione trampolino il corretto nome del metodo.
			
			3) Restituire una funzione lambda che esegue il codice del metodo
			   che si desidera creare.
			
			Per soddisfare il punto 3 si fa uso di rewrite-method code che,
			dato il nome di un metodo (nel file di specifica viene richiesto
			ma di fatto è inutilizzato) ed il suo corpo ne ricava argomenti
			e codice, aggiungendo anche un argomento 'this' alla lista
			(che conterrà l'istanza) per riscriverlo corretamente
			come lambda expression.
	
	Il risultato dei passaggi sopra elencati sarà quello di avere una funzione
	con	il nome del metodo.
	Tale funzione riceverà in ingresso l'istanza e gli argomenti da passare al
	metodo che si desidera creare.
	Data l'istanza cercherà lo slot con nome uguale a quello del metodo e 
	richiamerà la lambda expression contenuta nello slot passando i dovuti
	argomenti.

About

Object Oriented Lisp extension written in Lisp


Languages

Language:Common Lisp 100.0%