cons construiește o pereche dacă al doilea argument al lui cons este o listă (de lungime n), atunci rezultatul va fi o listă de lungime n+1, în care primul element va fi primul argument al lui cons, iar restul elementelor sunt cele din lista care este al doilea argument toate listele în Racket sunt perechi append concatenează liste (și toate argumentele trebuie să fie liste) ce este cu punct este o pereche [care pe a doua poziție nu are o listă] Ce diferă între paradigme * ce elemente sunt puse pe primul plan în limbaj * construcțiile de bază ale limbajului * operațiile care ne sunt expuse * modificări (mutabilitate) - în imperativ este necesar să putem modifica - în funcțional pur toate valorile sunt imutabile * nivelul de abstractizare față de hardware * valori de prim rang = valori pe care putem să le transmitem sau întoarcem din funcții / pe care putem să le construim ușor Mutabilitate: Collection c construiesc c result = f(c) --- f a fost scrisă de al programator / este într-o bibliotecă în f: Collections.sort(c) a rămas c la fel? Variabile nume valoare - la care variabila este legată modul de legare poate fi static sau dinamic domeniu de vizibilitate (scope) -- determinat static variabilele pot avea un tip declarat (dacă tipare explicită) valorile au un tip întotdeauna verificarea tipurilor se poate face static sau dinamic static = vizibil / posibil de determinat la momentul compilării dinamic = vizibil / posibil de determinat la execuție În exemplul Java: 2 variabile x 1 variabilă a legare dinamică a variabilelor În exemplul Racket: variabila f 2 variabile a 2 variabile b Recursivitate Funcții recursive - pe stivă (e.g. fact-1) rezultatul (cel puțin a unui) apelul recursiv este dat ca argument unei alte funcții - pe coadă (e.g. fact-aux) rezultatul apelului recursiv este întors direct (nu mai este dat ca argument unei alte funcții) beneficiază de tail-call optimization nu se mai încarcă stiva cu apelurile funcției (fact-1 3) (* 3 (fact-1 2) (* 2 (fact-1 1) (* 1 (fact-1 0) -> 1 -- acum pot înmulți pe n=1 cu 1 ) -> 1 -- acum pot înmulți pe n=2 cu 1 ) -> 2 -- acum pot înmulți pe n=3 cu 2 ) -> 6 -> 6 (fact-2 3) (fact-aux 3 1) (fact-aux n-1=2 (* n=3 r-p=1)->3 ) (fact-aux n-1=1 (* n=2 r-p=3)->6 ) (fact-aux n-1=0 (* n=1 r-p=6)->6 ) n=0 r-p este deja calculul complet - pot întoarce direct rezultatul <-------------------------- = 6