Your SlideShare is downloading. ×
Pe a3 perl-metaprogramming
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Pe a3 perl-metaprogramming

354

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
354
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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

×