Title: Linguaggi di Programmazione Secondo Semestre / 04 - Astrazione Sul controllo

Q: Funzioni (passaggio dei parametri)
A: Le funzioni sono dei sottoprogrammi in cui può essere suddiviso un programma, sono composte dai parametri che sono quelli formali e attuali, il cui numero di soito coincide. Hanno anche un sistema per scambiare dati in ritorno con il parametro di ritorno oppure accedendo all'ambiente non locale.
Inoltre anche il passaggio dei parametri può essere,  di ingresso di uscita o entrambi.
Passaggio per vaolre:
Se il parametro ha grandi dimensione questo meccanismo può essere molto lento
Passaggio per riferimento:Il passaggio per riferimento ( detto anche per variabile) realizza un meccanismo nel quale il parametro è sia di ingresso che di uscita. Il parametro attuale deve essere un'espressione dotata di I-valore
(nel c nonostante ci sia solo il passaggio per valore, possiamo utilizzare i pointer per "simulare" un passaggio di riferimento)
Passaggio per costante: Il passaggio per constante stabilisce che una variabile è read-only, (di solito i linguaggi decidono se passare per valore o riferimento in base alla dimensione della struttra)
Passaggio per risultato: quando entra nel corpo della funzione il parametro formale non ha alcun valore, ma quando la funzione tremina qualunque valore abbia preso il parametro formale viene messo in quello attuale (il parametro attuale dev'essere un l-value.
Passaggio per valore risultato: è un misto tra i due metodi quindi fa il passaggio per valore ma come ultima istruzione ricopia il valore nel parametro attuale (da non confondersi con il riferimento anche se in alcuni linguaggi erroneamente è implementato nello stesso modo)

Passaggio per nome

Q: Funzioni anonime
A: Le funzioni anonime, possono essere passate per paramentro o come valore di ritorno.
## Passata come parametro
In questo caso abbiamo due politiche il deep bleeding e lo shallow bleeding:
Nel deep bleding che è la tecnica utilizzata da tutti a scope dinamico e anche ad alcuni a scope statico: le variabili all'interno della funzione anonima viene catturato al monento della creazione, per fare ciò viene creato una clousure, con il codice da eseguire e un puntatore all'ambiente, quando la fuzione viene chiamata si crea un nuovo rda (si crea un nuovo rda perchè anche la funzione anomia potrebbe essere chiamata più volte) con il puntatore alla catena statica memorizzato nella clousure.
shallow bleeding: Invece prende l'ulitima definizione della variabile questo è molto simile alle politiche dello scope dinamico e quindi non cè bisogno di "molto lavoro"
## Funzioni come risultato
le funzioni come risultato hanno il problema che l'ambiente in cui sono state definito potrebbe essere stato distrutto, per questo ci sono due approcci in generale:
- allocare tutti gli RDA nella heap
- lasciare undefined beavior
linguaggi come il c non permettono questo tipo di situazioni poichè le funzioni possono essere definite solo nello scope globale

Q: Astrazione sui dati e sul controllo
A: Quello dei dati è nascondere la rappresentazione e operazioni
Mentre quella sul controllo, impacchettare alcune funzione in modo da sapere solamente cosa fa e come utilizzarlo nascondendo l'implmenetazione