Differenze tra le versioni di "Chiusura (informatica)"

Jump to navigation Jump to search
m
tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (6), </source> → </syntaxhighlight> (6)
("quali (stringhe, interi, ecc.)" ho rimosso le parentesi tonde perchè inutili)
m (tag source deprecati, replaced: <source lang= → <syntaxhighlight lang= (6), </source> → </syntaxhighlight> (6))
 
In [[ML programming language|ML]], il seguente codice definisce una funzione <code>f</code> che restituisce il parametro passatogli più 1:
 
<sourcesyntaxhighlight lang=ocaml>
fun f(x) = x + 1;
</syntaxhighlight>
</source>
Se una funzione utilizza variabili libere, ossia non locali, al momento della sua definizione si crea una chiusura che ''cattura'' tali variabili. Per esempio, in questo frammento di codice:
 
<sourcesyntaxhighlight lang=ocaml>
val y = 1;
fun f(x) = x + y;
</syntaxhighlight>
</source>
 
la struttura dati chiusura che rappresenta <code>f</code> contiene un riferimento alla variabile <code>y</code> presente nell'ambiente di definizione, in cui è legata al valore 1.
Invece se si usa una variabile assegnabile, <code>f</code> restituisce il valore del suo parametro sommato al valore di <code>y</code> al momento in cui viene chiamata.
Ad esempio:
<sourcesyntaxhighlight lang=ocaml>
val y = ref 1;
let f(x) = x + !y;
y := 5;
f(3);
</syntaxhighlight>
</source>
La prima chiamata di <code>f 3</code> restituisce 4, la seconda invece 8.
 
Per chiarire il ruolo dell'ambiente lessicale, si consideri il seguente frammento in [[ML programming language|ML]]:
 
<sourcesyntaxhighlight lang=ocaml>
let
val y = 1;
end
end
</syntaxhighlight>
</source>
in questo esempio esistono due diverse variabili con lo stesso nome <code>y</code>, quella del <code>let</code> più esterno, in cui vale 1, e quella del <code>let</code> più interno, in cui vale 2.
La chiusura <code>f</code> viene creata nell'ambiente più esterno, e fa quindi riferimento alla <code>y</code> con valore 1 e per questo, il risultato che si ottiene è 4, non 5.
Questo vale anche per il [[C++]].
 
<sourcesyntaxhighlight lang=cpp>
int Function(int arg)
{
return ++numDiChiamate;
}
</syntaxhighlight>
</source>
 
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 <code>final</code> dichiarati nel metodo nel quale è racchiusa.
 
<sourcesyntaxhighlight lang=java>
public interface Function<Da,A>
{
}
// altro...
</syntaxhighlight>
</source>
 
(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]])
601 443

contributi

Menu di navigazione