«Cel mai mare dintre limbajele de programare create vreodată«
— Alan Kay, „despre Lisp”

Când McCarthy a dezvoltat Lisp la sfârșitul anilor '50, acesta era radical diferit de limbajele existente, dintre care cel mai important era .
Lisp a întruchipat nouă idei noi:
1. Declarații condiționale (Conditionals). Declarațiile condiționale sunt o construcție if-then-else. Acum le considerăm de la sine înțelese. Ele au fost de McCarthy în timpul dezvoltării Lisp. (Fortran avea doar declarații goto, strâns legate de instrucțiunile de ramificare hardware.) McCarthy, fiind în comitetul Algol, a introdus declarațiile condiționale în Algol, de unde s-au răspândit în alte limbaje.
2. Tipuri funcționale (A function type). În Lisp, funcțiile sunt obiecte de primă clasă — ele sunt tipuri de date, la fel ca numerele, șirurile etc., au reprezentare literală, pot fi stocate în variabile, pot fi transmise ca argumente, etc.
3. Recursie (Recursion). Recursia, desigur, exista ca o concept matematic înainte de Lisp, dar Lisp a fost primul limbaj de programare care a susținut-o. (Aceasta este posibil subînțeleasă în crearea funcțiilor ca obiecte de primă clasă.)
4. Noi concepte de variabile (A new concept of variables). În Lisp, toate variabilele sunt indicatoare eficiente. Valorile sunt ceea ce au tipurile, nu variabilele, iar atribuirea sau legarea variabilelor înseamnă copierea indicatorilor, nu a ceea ce indică.
5. Colectarea de gunoi (Garbage-collection).
6. Programele sunt compuse din expresii (Programs composed of expressions). Programele în Lisp sunt copaci de expresii, fiecare returnând o valoare. (Unele expresii Lisp pot returna valori multiple.) Acest lucru contrastează cu Fortran și cu multe alte limbaje de succes, care disting între „expresii” și „declarații”.
Era natural să existe o astfel de distincție în Fortran, deoarece limbajul era orientat pe linie (ne surprinde ținând cont de faptul că formatul de intrare era perforat). Nu puteai avea declarații înglobate. Și deși aveai nevoie de expresii matematice pentru a funcționa, nu avea sens să obligi ceva altceva să returneze o valoare, deoarece putea să nu existe nimic care să aștepte un return.
Limitările au fost eliminate odată cu apariția limbajelor structurate pe blocuri, dar deja era prea târziu. Distanța dintre expresii și afirmații s-a consolidat. Aceasta a evoluat de la Fortran la Algol și mai departe la urmașii lor.
Când un limbaj este complet format din expresii, puteți construi expresii cum doriți. Puteți scrie fie (folosind sintaxa )
(if foo (= x 1) (= x 2))sau
(= x (if foo 1 2))7. Tipul simbol (A symbol type). Simbolurile diferă de șirurile de caractere, în acest caz puteți verifica egalitatea comparând pointerele.
8. Notație pentru cod (A notation for code) folosind arbori din simboluri.
9. Întregul limbaj este întotdeauna disponibil (The whole language always available). Nu există o distincție explicită între timpul de citire, timpul de compilare și timpul de execuție. Puteți compila sau rula codul în timpul citirii, sau citi sau rula codul în timp ce compilați, sau citi sau compila codul în timpul execuției.
Rularea codului în timpul citirii permite utilizatorilor să reprogrameze sintaxa Lisp-ului; rularea codului în timpul compilării este temelia pentru macrocomenzi; compilarea în timpul execuției este baza pentru utilizarea Lisp-urilor ca limbaj de extensie în programe precum Emacs; și, în sfârșit, citirea în timpul execuției permite programelor să interacționeze, folosind s-expresiile, o idee recent reinventată în XML.
Concluzie
Când Lisp a fost inventat, toate aceste idei erau foarte departe de practicile de programare obișnuite dictate de hardware-ul disponibil la sfârșitul anilor '50.
În timp, limbajul implicit, concretizat în succesul limbajelor populare, a evoluat treptat către Lisp. Punctele 1-5 sunt acum larg răspândite. Punctul 6 începe să apară în curentul principal. În Python există un anumit aspect al punctului 7, deși nu există o sintaxă corespunzătoare. Punctul 8, care (împreună cu punctul 9) face posibile macrocomenzile în Lisp, există încă doar în Lisp, probabil pentru că (a) necesită aceste paranteze sau ceva la fel de greu de acceptat, și (b) dacă adăugați această ultimă creștere a puterii, nu mai puteți susține că ați inventat un nou limbaj, ci doar că ați dezvoltat un nou dialect al Lisp-ului; -)
Deși este util pentru programatorii moderni, este ciudat să descriem Lisp prin prisma diferențelor sale față de diverse tehnici folosite în alte limbaje. Poate că acesta nu era gândul lui McCarthy. Lisp nu a fost proiectat pentru a corecta erorile lui Fortran; a apărut mai degrabă ca un produs secundar al unei încercări .
Sursa: habr.com
