Differenze tra le versioni di "Chiusura (informatica)"

m
tag obsoleti
m (Orfanizzo Java (linguaggio))
m (tag obsoleti)
Le chiusure sono presenti in quei linguaggi che trattano le [[Funzione (informatica)|funzioni]] come ''oggetti di prima classe'' (''first-class object''), cioè consentono di passarle come parametri ad altre funzioni, restituirle come valori da altre funzioni, assegnarle a variabili, ecc., come si fa con i tipi più semplici, quali ([[Stringa (informatica)|stringhe]], [[Numero intero|interi]], ecc.).
 
In [[ML programming language|ML]], il seguente codice definisce una funzione <ttcode>f</ttcode> che restituisce il parametro passatogli più 1:
 
<source lang=ocaml>
</source>
 
la struttura dati chiusura che rappresenta <ttcode>f</ttcode> contiene un riferimento alla variabile <ttcode>y</ttcode> presente nell'ambiente di definizione, in cui è legata al valore 1.
Poiché in ML il valore di <ttcode>y</ttcode> non può cambiare il comportamento di <ttcode>f</ttcode> non cambia.
Invece se si usa una variabile assegnabile, <ttcode>f</ttcode> restituisce il valore del suo parametro sommato al valore di <ttcode>y</ttcode> al momento in cui viene chiamata.
Ad esempio:
<source lang=ocaml>
f(3);
</source>
La prima chiamata di <ttcode>f 3</ttcode> restituisce 4, la seconda invece 8.
 
Per chiarire il ruolo dell'ambiente lessicale, si consideri il seguente frammento in [[ML programming language|ML]]:
end
</source>
in questo esempio esistono due diverse variabili con lo stesso nome <ttcode>y</ttcode>, quella del <ttcode>let</ttcode> più esterno, in cui vale 1, e quella del <ttcode>let</ttcode> più interno, in cui vale 2.
La chiusura <ttcode>f</ttcode> viene creata nell'ambiente più esterno, e fa quindi riferimento alla <ttcode>y</ttcode> con valore 1 e per questo, il risultato che si ottiene è 4, non 5.
 
== Utilizzi delle chiusure ==
 
Alcuni linguaggi orientati agli oggetti permettono al programmatore di usare oggetti che simulano alcune caratteristiche delle chiusure. Per esempio:
* [[Java (linguaggio di programmazione)|Java]] permette al programmatore di definire "[[Classe (informatica)|classi]] anonime" all'interno di un [[Metodo (informatica)|metodo]]; una classe anonima può fare riferimento ai nomi dichiarati nelle classi nelle quali è racchiusa e ai nomi di oggetti di tipo <ttcode>final</ttcode> dichiarati nel metodo nel quale è racchiusa.
 
<source lang=java>
(Si noti che questo esempio usa degli aspetti del linguaggio disponibili solo a partire dalla [[Java 5|versione 1.5/5.0 di Java]], come i [[Generics Java|generics]], l'[[Java 5#Autoboxing|autoboxing]] e l'[[Java 5#Autoboxing|autounboxing]])
 
* In [[C++]] e [[D (linguaggio di programmazione)|D]], i programmatori possono definire classi che fanno l'[[Overloading|overload]] dell'operatore <ttcode>()</ttcode> (operatore di applicazione della funzione). Questo genere di classi sono chiamate [[Oggetto funzione|oggetti funzione]] o, occasionalmente, ''funtori'' (anche se quest'ultimo termine è ambiguo, dato che in altri linguaggi ha un significato molto diverso). Questi oggetti funzione si comportano in modo simile alle funzioni nei linguaggi di programmazione funzionali, ma sono diversi dalle chiusure nel fatto che le variabili del loro ambiente non vengono "catturate". Per simulare una vera chiusura, si può immaginare di mettere tutte le variabili globali in una singola struttura (<ttcode>struct</ttcode>) e di passarne una copia ad un oggetto funzione.
* Il [[C sharp|C#]] permette ad un ''delegato'' (<ttcode>delegate</ttcode>) di memorizzare un riferimento ad un metodo di un'istanza di una classe (cioè un oggetto); quando verrà chiamato questo delegato, il metodo verrà invocato per quella particolare istanza. Per simulare una vera chiusura, si può creare un'istanza di una classe (cioè un oggetto) con gli attributi necessari. Un altro modo per simulare le chiusure è stato introdotto dalla versione 2.0 del linguaggio, con l'utilizzo dei '''metodi anonimi'''.
* Nel [[C++11]] è possibile creare una chiusura tramite l'utilizzo di lambda expressions oppure di std::function.
 
1 166 638

contributi