* variabile -- modul de gestionare a valorilor * ce este o variabilă * nume / referință pentru un spațiu de memorie * nume pentru un calcul / pentru o valoare abstractă care are o semnificație * în calculul lambda, valoarea este forma normală obținută prin reducerea unei expresii lambda * cum se face legarea variabilelor * static * dinamic -- o variabilă poate să fie legată la diverse valori pe parcursul execuției * la ce putem lega o variabilă -- valori de prim rang * construcție dinamică și metaprogramare * modul de tipare * după când se face verificarea * static - înainte de execuție * dinamic - în timpul execuției * după cât de ușor putem agrega valori de tipuri diferite / cât de ușor face limbajul conversie implicită * execuție -- modul de gestionare a controlului * modul de transfer al parametrilor ~ modul de evaluare a funcțiilor meta-programare: (eval (cons + (list 1 2 3))) construcție dinamică a funcțiilor: (compose ((curry map) ((curry +) 1)) cdr) (Racket) map (+1) . tail (Haskell) legare dinamică ~ am efecte laterale Expresie cu *efect(e) lateral* -- are și un alt efect decât întoarcerea unui rezultat. * schimbarea valorii unei variabile * schimbarea stării globale a programului * afișare sau citire de la consolă Dacă evaluarea unei funcții nu are efecte laterale -> funcția este *funcție pură* e.g. funcții matematice (sin, cos) O expresie este *transparentă referențial* dacă oricare apariție a ei poate fi înlocuită cu valoarea expresiei. O expresie cu efect lateral nu este transparentă referențial pentru că înlocuirea ei cu valoarea duce la pierderea efectului lateral. în Java: f(List lista) lista = new LinkedList() --> modificarea nu este vizibilă în exteriorul funcției Call by sharing * sunt vizible în exterior modificările asupra obiectului la care indică referința * nu sunt vizibile în exterior modificările referinței în sine în C f(int &x) x = 5 --> modificare vizibilă în exterior