linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png differ
linguaggi/s02/sottoprogrammi_ed_eccezioni.md
... ...
@@ -287,3 +287,128 @@ restituita: disciplina a pila non funziona!!
287 287
288 288
in scope dinamico la x dentro la f puo velere 7 (se pero si valuta lo scope di f quando viene chiamata e non quando viene passata) quindi guardo il suo ambiente quando viene chiamata non passata. Questa regola si chiama regola di shallow binding
289 289
Altrimenti (nel caso in cui io valuti l'ambiente della funz quando essa viene passata e non quand o viene chiamata), ovvero alla riga `g(f)` quindi la x vale 5. Questa regola si chiama deep binding
290
+
291
+#### i funarg problems: downward
292
+
293
+Quando una procedura viene passata come parametro si crea un riferimento tra un nome (h) e una procedura (f)
294
+
295
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png)
296
+
297
+```
298
+nt x=4; int z=0;
299
+int f (int y){
300
+return x*y;}
301
+void g ( int h(int n) ) {
302
+int x;
303
+x = 7;
304
+z = h(3) + x ;
305
+end;
306
+…
307
+{int x = 5;
308
+g(f);
309
+}
310
+```
311
+
312
+deep binding: quando nel corpo di g vado ad usare f (quando andro a chiamare f da dentro g) essa avra' delle var non locali (x) che valuto nell'ambiente che c'e al momento della chiamata della funz alla quale f e' stata passata
313
+Ricapitolando: il bind viene fatto quando g chiama f
314
+shallow binding: il bind viene valutato dentro g quando f viene eseguito
315
+
316
+![ ottoprogrammi_ed_eccezioni_2026-03-19_13-29-10](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png)
317
+
318
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png)
319
+
320
+#### Chiusure
321
+
322
+Passare dinamicamente sia il legame col codice della funzione, che il suo ambiente non locale,cioè una chiusura `<code, env>`
323
+Alla chiamata di una procedura passata per parametro
324
+– alloca (come sempre) il record di attivazione
325
+– prendi il puntatore di catena statica dalla chiusura
326
+
327
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png)
328
+
329
+#### Riassumendo: parametri funzioni (e per nome)
330
+
331
+Chiusure per mantenere puntatore all’ambiente statico del corpo di una funzione
332
+
333
+Alla chiamata, il puntatore di catena statica determinato mediante la chiusura
334
+
335
+Tutti i puntatori di catena statica puntano sempre indietro nella pila
336
+– record di attivazione possono essere “saltati” per accedere a var non locali
337
+– de-allocazione dei record di attivazione secondo stretta politica a pila (lifo: last-in-first-out)
338
+
339
+### Scope dinamico: implementazione
340
+
341
+Shallow binding:
342
+– non necessita di alcuna attenzione
343
+• per accedere a x, risali la pila
344
+• uso delle strutture dati solite (A-list, CRT)
345
+
346
+Deep binding
347
+– usa necessariamente qualche forma di chiusura per “congelare” uno scope da riattivare più tardi
348
+
349
+### Deep e shallow binding con scope statico
350
+
351
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png)
352
+
353
+#### Esercizio:
354
+
355
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png)
356
+
357
+#### Esercizio in classe
358
+
359
+```
360
+{void foo (int f(), int n){
361
+ int m = 10;
362
+ int fie(){ write (n,m)}
363
+ if (n==0) f();
364
+ else {m=30;
365
+ foo(fie,0);
366
+ }
367
+ }
368
+ int g(){
369
+ write(10);
370
+ }
371
+ foo(g,1);
372
+}
373
+```
374
+
375
+si dica cosa stampa in frammento con shallow e deep bindig
376
+deep binding:
377
+
378
+- n=1 e m=30
379
+
380
+shallow binding:
381
+
382
+- Es: spiegare vantaggi e svantaggi scope statico e scope dinamico
383
+ scope statico: vantaggio: maggiore chiarezza del codice (trasparenza referenziale) e la stessa funz chiamata in tempi diversi con stessi param non cambiano il risultato
384
+ svantaggi: difficile da implementare (catena)
385
+ scope dinamico: impl facile, svantaggio: progr molto meno comprensibili
386
+
387
+#### upward funarg problema
388
+
389
+Alcuni linguaggi (eg funzionali) permettono di restituire una funzione
390
+Se la funzione ha variabili locali queste devono sopravvivere indipendentemente dalla struttura a pila: hanno vita indefinitamente lunga
391
+
392
+![sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png)
393
+
394
+![sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png)
395
+
396
+(la pila va dall'alto verso il basso)
397
+
398
+**Morale: funzioni come risultato**
399
+• Uso delle chiusure, ma…
400
+• I record di attivazione persistono indefinitamente
401
+– perdita proprietà della pila (lifo)
402
+• Come implementare la “pila” in questo caso:
403
+– non deallocare esplicitamente
404
+– record di attivazione sullo heap
405
+– le catene statica e dinamica collegano i record
406
+– invoca il garbage collector quando necessario
407
+
408
+domande orale:
409
+quasi mai esercizi
410
+domande sui concetti del corso es per verdere se siamo in geado di esporre gli arg tecnici es
411
+cos'e un tipo di dato, cos'e una variabile, siegami in dettaglio come funz l'impl del meccanismo di deep binding con le chiusure
412
+
413
+differenza tra meccanismo di invocazione di un mentodo e chiamata di funz in un ling imperativo.
414
+i ling oop in cosa sono meglio dei ling normali (procedurali?)