1. Parte 3
Metaprogramming
in Perl
Linguaggi dinamici – A.A. 2009/2010
1
2. Introduzione
Il Perl mette a disposizione tutta una serie di
meccanismi per il metaprogramming
Introspezione di classi e metodi
Esecuzione di codice generato dinamicamente
Gestione degli errori a runtime
Tali funzionalità sono presenti sotto forma di
funzioni builtin e di moduli
Linguaggi dinamici – A.A. 2009/2010
2
3. ESEMPI:
ref.pl
Introspezione
La funzione builtin ref() restituisce una stringa
non vuota se l'espressione in ingresso è una
reference
La stringa restituita è il nome del tipo di dato
puntato dalla reference
Nel caso di oggetti (blessed references), viene
restituito il nome dell'oggetto corrispondente
Linguaggi dinamici – A.A. 2009/2010
3
4. ESEMPI:
isa_can.pl
Introspezione
La classe madre viene chiamata UNIVERSAL
UNIVERSAL mette a disposizione alcuni
metodi di introspezione
Metodo isa(“classe”): restituisce vero se
l'oggetto è di tipo “classe”
Metodo can(“metodo”): restituisce una
reference alla funzione “metodo” dell'oggetto
Linguaggi dinamici – A.A. 2009/2010
4
5. Introspezione
In alternativa, si può usare il modulo
Class::Meta::Method che fornisce
un'interfaccia di introspezione più semplice
Va installato
perldoc Class::Meta::Method
Ciascuna classe è estesa con una classe di
lavoro (Class::Meta::Class) che fornisce
metodi di introspezione
Linguaggi dinamici – A.A. 2009/2010
5
6. ESEMPI:
person.pl
AUTOLOAD
Quando viene invocato un metodo non definito
su un oggetto, l'interprete invoca il metodo
AUTOLOAD
AUTOLOAD può essere utilizzato per
implementare in maniera eleganti i metodi get
()/set() di una classe
Linguaggi dinamici – A.A. 2009/2010
6
7. ESEMPI:
anon_sub.pl
Subroutine anonime
E' possibile assegnare a variabili delle funzioni
(che vengono perciò chiamate subroutine
anonime)
Tali funzioni non sono invocabili tramite un
vero e proprio nome
Le sub anonime possono essere invocate solo
tramite la reference generata durante
l'assegnazione
Linguaggi dinamici – A.A. 2009/2010
7
8. ESEMPI:
closure.pl
Closure
In Perl, le closure (blocchi di codice cui sono
associati una o più variabili) sono
implementate tramite subroutine anonime
Si crea (e si restituisce) una funzione anonima,
funzione del parametro passato in ingresso
Linguaggi dinamici – A.A. 2009/2010
8
9. ESEMPI:
eval.pl
Generazione dinamica di codice
Si usa il builtin eval nelle sue due forme:
eval EXPR: l'espressione viene compilata ed
eseguita come un programma Perl
La compilazione avviene ad ogni invocazione
eval BLOCK: il blocco viene compilato ed
eseguito come un programma Perl
La compilazione avviene solo una volta
eval() restituisce il valore dell'ultima
espressione del mini programma
Se qualcosa va storto, eval() restituisce undef
e la variabile speciale $@ contiene il
messaggio di errore
Linguaggi dinamici – A.A. 2009/2010
9
10. ESEMPI:
exceptions.pl
Gestione degli errori a runtime
eval() è anche un potente strumento di
intercettazione degli errori a tempo di
esecuzione (tramite il controllo di $@)
Si può emulare la gestione degli errori di Java
(try-catch) con il modulo Exception::Class
Costrutto try eval
Costrutto catch Exception::Class-caught()
Costrutto throw Exception::Class-throw()
Linguaggi dinamici – A.A. 2009/2010
10