Mi rendo conto che sono in ritardo di anni per rispondere a questa domanda, ma mi sono imbattuto in questa domanda mentre eseguivo una ricerca sul Web e volevo correggere alcune informazioni errate pubblicate qui.
"Chiusura" indica semplicemente un oggetto chiamabile che contiene sia codice che un ambiente che fornisce collegamenti per variabili libere all'interno di quel codice. Quell'ambiente è solitamente un ambiente lessicale, ma non esiste una ragione tecnica per cui non può essere un ambiente dinamico.
Il trucco è chiudere il codice sull'ambiente e non sui valori particolari. Questo è ciò che Lisp 1.5 ha fatto, e anche ciò che MACLisp ha fatto per "down-down funargs".
si può vedere come Lisp 1.5 ha fatto questo leggendo il Lisp 1.5 manuale in http://www.softwarepreservation.org/projects/LISP/book
Prestare particolare attenzione in Appendice B a come eval gestisce FUNZIONE e come applicare le maniglie FUNARG.
È possibile ottenere il sapore di base della programmazione utilizzando chiusure dinamiche da http://c2.com/cgi/wiki?DynamicClosure
È possibile ottenere una nell'introduzione profondità alle questioni di attuazione da ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-199.pdf
moderna con scope dinamico lingue usano generalmente poco profondo legame, dove la corrente il valore di ciascuna variabile viene mantenuto in una posizione globale e le chiamate di funzione salvano i vecchi valori in pila. Un modo per implementare chiusure dinamiche con rilegatura bassa è descritto in http://www.pipeline.com/~hbaker1/ShallowBinding.html
Non modificherò la risposta ma: "Solitamente" è sbagliato - le chiusure sono sempre "chiusura lessicale", chiamate così perché chiudono l'espressione sopra il suo ambiente lessicale. Per quanto riguarda il fatto che lambdas sia sicuro - non essere in grado di usare lambdas come chiusure sta diminuendo enormemente il loro valore, ma anche senza questo, l'ambito dinamico è intrinsecamente dannoso per la salute del tuo programma poiché non puoi essere sicuro del significato di qualsiasi legame. –
Grazie per il collegamento funargs. Non l'ho mai saputo prima. –
@Eli Barzilay: hai ragione, ero eccessivamente sdolcinato. Rimuoverò 'di solito'. Per quanto riguarda la salute del programma generale, sono completamente d'accordo, ma la domanda non è generale. Come ho detto, i lambda con uno scope dinamico sono sicuri quanto i puntatori senza restrizioni ... –