«Il linguaggio di programmazione più grande mai creato«
— Alan Kay, «on Lisp»

Quando McCarthy sviluppò Lisp alla fine degli anni '50, era radicalmente diverso dai linguaggi esistenti, il più importante dei quali era .
Lisp ha incarnato nove nuove idee:
1. Espressioni condizionali (Conditionals). Le espressioni condizionali sono la costruzione if-then-else. Oggi le consideriamo scontate. Furono da McCarthy durante lo sviluppo di Lisp. (Fortran in quel periodo aveva solo istruzioni goto, strettamente legate all'istruzione di branch sull'hardware sottostante.) McCarthy, facendo parte del comitato di Algol, introdusse le espressioni condizionali in Algol, da dove si diffusero in altri linguaggi.
2. Tipi funzionali (A function type). In Lisp le funzioni sono oggetti di primo classe: sono un tipo di dato, proprio come numeri, stringhe ecc., e hanno una rappresentazione letterale, possono essere memorizzate in variabili, possono essere passate come argomenti, ecc.
3. Ricorsione (Recursion). La ricorsione, ovviamente, esisteva come concetto matematico prima di Lisp, ma Lisp è stato il primo linguaggio di programmazione a supportarla. (Questo è implicato nella creazione di funzioni come oggetti di primo grado.)
4. Nuova concezione di variabili (A new concept of variables). In Lisp, tutte le variabili sono puntatori efficaci. I valori sono ciò che appartiene ai tipi, non alle variabili, e l'assegnazione o il collegamento delle variabili significa copiare puntatori, non ciò a cui puntano.
5. Raccolta dei rifiuti (Garbage-collection).
6. Programmi composti da espressioni (Programs composed of expressions). I programmi in Lisp sono alberi di espressioni, ognuna delle quali restituisce un valore. (Alcune espressioni Lisp possono restituire valori multipli.) Questo contrasta con Fortran e con molti altri linguaggi di successo che fanno distinzione tra "espressioni" e "istruzioni".
Era naturale avere questa distinzione in Fortran, perché il linguaggio era orientato linearmente (non sorprende per un linguaggio in cui il formato di input era il cartoncino perforato). Non si potevano avere istruzioni annidate. E mentre erano necessarie espressioni matematiche per lavorare, non aveva senso costringere nient'altro a restituire un valore, perché potremmo non avere nulla che aspettasse un ritorno.
Le limitazioni sono state rimosse con l’emergere dei linguaggi strutturati a blocchi, ma a quel punto era già troppo tardi. La distinzione tra espressioni e affermazioni era già consolidata. È passata da Fortran ad Algol e oltre ai loro discendenti.
Quando un linguaggio è completamente composto da espressioni, puoi costruire espressioni come desideri. Puoi scrivere sia (usando la sintassi )
(if foo (= x 1) (= x 2))oppure
(= x (if foo 1 2))7. Tipo simbolo (A symbol type). I simboli si differenziano dalle stringhe, in questo caso puoi verificare l'uguaglianza confrontando i puntatori.
8. Notazione per il codice (A notation for code) utilizzando alberi di simboli.
9. L'intero linguaggio è sempre disponibile (The whole language always available). Non c'è una distinzione esplicita tra tempo di lettura, tempo di compilazione e tempo di esecuzione. Puoi compilare o eseguire codice durante la lettura, oppure leggere o eseguire codice mentre compili, oppure leggere o compilare codice durante l'esecuzione.
Eseguire codice durante la lettura consente agli utenti di riscrivere la sintassi di Lisp; eseguire codice durante la compilazione è alla base delle macro; compilare durante l'esecuzione è alla base dell'uso di Lisp come linguaggio di estensione in programmi come Emacs; infine, leggere durante l'esecuzione consente ai programmi di interagire utilizzando espressioni s, un'idea recentemente reinventata in XML.
Conclusione
Quando Lisp è stato appena inventato, tutte queste idee erano molto lontane dalle pratiche comuni di programmazione dettate dall'hardware disponibile alla fine degli anni '50.
Col passare del tempo, il linguaggio di default, incarnato nel successo di linguaggi popolari, è gradualmente evoluto verso Lisp. I punti 1-5 ora sono ampiamente diffusi. Il punto 6 inizia a comparire nel mainstream. In Python in qualche modo esiste il punto 7, anche se non c'è una sintassi appropriata. Il punto 8, che (insieme al punto 9) rende possibili le macro in Lisp, è ancora presente solo in Lisp, forse perché (a) richiede quelle parentesi o qualcosa di altrettanto brutto, e (b) se aggiungi questo ultimo aumento di potenza, non puoi più affermare di aver inventato un nuovo linguaggio, ma solo di aver sviluppato un nuovo dialetto di Lisp; -)
Sebbene sia utile per i programmatori moderni, è strano descrivere Lisp in base alle sue differenze rispetto a tecniche arbitrarie adottate in altri linguaggi. Forse non è questo che McCarthy aveva in mente. Lisp non è stato progettato per correggere gli errori di Fortran; è emerso piuttosto come un sottoprodotto di un tentativo .
Fonte: habr.com
