A closure is a record storing a function, together with an environment: A mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created. (Wikipedia)
Ecco quello che capisco. Una funzione può accedere a 3 tipi di variabili (assumiamo JavaScript):
- Parametri: i parametri di una funzione.
- Variabili locali: le variabili definite all'interno di una funzione. (ma non le variabili definite in una funzione nidificata. Cioè, una funzione non può accedere a variabili definite in un'altra funzione, dove questa altra funzione è definita all'interno della funzione di cui stiamo parlando)
- Variabili libere: le variabili definite al di fuori della funzione. Cioè, la funzione può accedere alle variabili definite nella funzione che circonda la nostra funzione, e le variabili definite nella funzione che circonda la funzione che circonda la nostra funzione, ecc.
Di questi 3 tipi, i valori delle variabili di tipo 1 e 2 sono ben noti al momento della chiamata di una funzione. Tuttavia, le variabili di tipo 3 possono avere qualsiasi valore nel momento in cui viene chiamata una funzione. Per quanto ne so, questa è una proprietà delle lingue con scope dinamiche. Cioè, AFAIK, nelle lingue con lessical scope, non possiamo avere una situazione del genere.
Ecco dove una chiusura entra in scena. Una chiusura lega le variabili libere di una funzione. Quindi, non esiste alcuna variabile che non abbia un valore ben noto, al momento in cui viene chiamata una funzione.
Quindi, la mia domanda è la seguente:
Are closures a must have in lexically scoped languages, which allow nested functions and which have first class functions?
Per me, sembra così. Perché se le funzioni di prima classe annidate sono consentite in una lingua senza avere chiusure, significa che le variabili libere avranno valori non deterministici nel momento in cui viene chiamata una funzione. Ma AFAIK, con valori non deterministici è una proprietà delle lingue con ambito dinamico . Quindi, sostengo:
If a language claims to be lexically scoped, and if a language allows nested first class functions, then, by definition, every function in that language is (must be) a closure.
Sono corretto in questo?