2012-05-23 25 views
5

Penso di averlo giù, ma vorrei confermarlo.In che modo l'ambito influenza generalmente l'uso di funzioni annidate?

  1. Con scope dinamico, non importa se si utilizza una funzione nidificata o una funzione separata, come variabili semplicemente dipendono dallo stack di chiamata.

  2. Con solo funzioni pure coinvolte, non importa se si utilizza una funzione nidificata o una funzione separata. Questo è vero indipendentemente dal tipo di ambito.

  3. Con scope lessicale, le funzioni nidificate simulano approssimativamente la chiamata a una funzione con ambito dinamico.

  4. Con scope lessicale, un programma scritto interamente con funzioni pure (che consente forse una singola stampa impura sullo standard output) non richiede alcuna raccolta di dati inutili. Se fa la differenza, sto pensando specificamente a GNU C con l'estensione della funzione annidata per questa domanda.

NOTA: pura funzione, voglio dire la funzione totalmente pura: l'unica cosa che "leggere" sono i parametri, l'unica cosa "scritto" è il funzioni restituiscono.

Grazie

+0

standard C non ha funzioni nidificate, così ho modificato il titolo e tag! –

+0

Grazie, anche se solo per le 4 del mattino mi sono davvero interessato alle lingue specifiche. Per 1-3 mi sto interrogando sullo scope lessicale in generale, cioè sulle regole del pollice che dovrebbero applicarsi a qualsiasi linguaggio che implementa appropriatamente lo scoping lessicale. Quindi va bene se ci sono delle eccezioni. – Sonarpulse

+0

Ah, ok. Immaginavo che stavi parlando di C in particolare, poiché è l'unica lingua che hai menzionato. Sentiti libero di adattare le modifiche al titolo, ecc. Se necessario! –

risposta

1

Sarebbe utile se si ha un linguaggio specifico in mente, anche se contrassegnati questo con C e Lisp, che non aiuta tremendamente senza alcuni esempi concreti, come i due sono abbastanza differenti. Non penso che C abbia un ambito dinamico, e ci sono numerosi Lisp che supportano molte combinazioni e varianti di scope dinamici e lessicali.

  1. Questo è corretto, ma alcune lingue complicare questo sostenendo ambito dinamico e lessicale, permettendo al programmatore di specificare quale utilizzare (Clojure e Common Lisp, per esempio).

  2. Anche questo è corretto. In questo caso, ciò di cui si sta parlando è una funzione senza effetti collaterali e senza alcuna variabile libera.

  3. Questo non è esattamente vero, è più complicato di così. In una lingua con ambito lessicale che supporta funzioni e chiusure di prima classe, una funzione annidata sarà chiudi oltre variabili libere che sono legate nell'ambiente in cui è definita, e potresti restituire quella funzione a un ambito esterno e quelle chiuse- le variabili over saranno accessibili e si riferiscono allo scope originale in cui sono state definite. Di nuovo, è difficile parlare in astratto senza esempi concreti da specifici linguaggi di programmazione, quindi se hai qualcosa in mente, dovresti modificare la tua domanda con il codice campioni.

  4. Non sono sicuro di cosa intendi per "pulizia dell'immondizia"? Se ti riferisci alla garbage collection come nella gestione automatica della memoria, questo non è corretto in generale, ma non voglio commentare il caso specifico di GNU C con funzioni annidate, dato che non so esattamente come funzioni.

+0

Penso che stia parlando dell'estensione della funzione nidificata GCC – slezica

+0

Sì, ho capito dopo le modifiche, ma mi ha anche chiesto dell'ambito dinamico che non esiste in C, vero? – spacemanaki

+0

contento di qui ho ragione sui primi due. – Sonarpulse

2

Hai ragione. Non proverei a mettere questo nel mio cervello come un caso-per-caso mnemo, però - cerca di capire il perché, e avrai meno sorprese.

La documentazione sull'argomento (http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html) è piuttosto buona.Se sai come funziona lo stack in C, dovresti capire subito.

Inoltre, un dono che ho trovato sull'interwebs che possono essere utili, dato alla tua domanda:

#define lambda(type, body) ({ \ 
    type __anon_func__ body \ 
    __anon_func__; \ 
}) 

int (*foo) (double) = lambda(int, (double x) { return (int) x; }); 
+0

macro interessante che hai lì. Da dove viene esattamente la funzione sottostante, __anon_func__? Non riesco a trovarlo per qualche motivo. – Sonarpulse

+0

'Anon func' è il nome che ho dato. Le due funzioni gcc utilizzate sono istruzioni composte e funzioni nidificate. – slezica

Problemi correlati