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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Pe a3 perl-metaprogramming

351
views

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
351
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