«Il più grande linguaggio di programmazione mai creato«
— Alan Kay, "sul Lisp"

Quando McCarthy sviluppò il Lisp alla fine degli anni '1950, era radicalmente diverso dai linguaggi esistenti, il più importante dei quali era .
Lisp incarnava nove nuove idee:
1. CondizionaliLe condizionali sono costrutti if-then-else. Ora le diamo per scontate. Lo erano McCarthy durante lo sviluppo di Lisp. (All'epoca, il Fortran aveva solo istruzioni goto, strettamente legate alle istruzioni di diramazione sull'hardware sottostante.) McCarthy, mentre faceva parte del comitato Algol, introdusse le istruzioni condizionali in Algol, da dove si diffusero ad altri linguaggi.
2. Tipi funzionali (tipo di funzione)In Lisp, le funzioni sono oggetti di prima classe: sono un tipo di dati, proprio come i numeri, le stringhe, ecc., e hanno una rappresentazione letterale, possono essere memorizzate in variabili, possono essere passate come argomenti, ecc.
3. RicorsioneLa ricorsione, ovviamente, esisteva come concetto matematico prima del Lisp, ma il Lisp è stato il primo linguaggio di programmazione a supportarla. (Questo è forse implicito nella creazione di funzioni come oggetti di prima classe.)
4. Un nuovo concetto di variabiliIn Lisp, tutte le variabili sono di fatto puntatori. I valori sono ciò che i tipi, non le variabili, hanno, e assegnare o associare variabili significa copiare i puntatori, non ciò a cui puntano.
5. Raccolta dei rifiuti.
6. I programmi sono composti da espressioni.I programmi Lisp sono alberi di espressioni, ognuna delle quali restituisce un valore. (Alcune espressioni Lisp possono restituire più valori.) Questo contrasta con Fortran e molti altri linguaggi di successo, che distinguono tra "espressioni" e "istruzioni".
Era naturale che ci fosse questa distinzione in Fortran, perché il linguaggio era orientato alle righe (cosa non sorprendente per un linguaggio il cui formato di input era una scheda perforata). Non era possibile annidare le istruzioni. E finché si avevano bisogno di espressioni matematiche con cui lavorare, non aveva senso far sì che qualcos'altro restituisse un valore, perché poteva non esserci nulla in attesa di un ritorno.
Queste restrizioni furono eliminate con l'avvento dei linguaggi con struttura a blocchi, ma ormai era troppo tardi. La distinzione tra espressioni e istruzioni si era già consolidata. Si trasmise dal Fortran all'Algol e ai loro discendenti.
Quando un linguaggio è composto interamente da espressioni, puoi comporre le espressioni come preferisci. Puoi scrivere (usando la sintassi )
(if foo (= x 1) (= x 2))o
(= x (if foo 1 2))7. Un tipo di simboloI simboli sono diversi dalle stringhe, nel qual caso è possibile verificarne l'uguaglianza confrontando i puntatori.
8. Una notazione per il codice utilizzando alberi di simboli.
9. L'intera lingua è sempre disponibile.Non esiste una netta distinzione tra tempo di lettura, tempo di compilazione e tempo di esecuzione. È possibile compilare o eseguire codice durante la lettura, oppure leggere o eseguire codice durante la compilazione, oppure leggere o compilare codice durante l'esecuzione.
L'esecuzione del codice durante la lettura consente agli utenti di riprogrammare la sintassi Lisp; l'esecuzione del codice durante la compilazione è la base per le macro; la compilazione durante l'esecuzione è la base per l'utilizzo di Lisp come linguaggio di estensione in programmi come Emacs; infine, la lettura durante l'esecuzione consente ai programmi di comunicare utilizzando le espressioni s, un'idea recentemente reinventata in XML.
conclusione
Quando il Lisp fu inventato, tutte queste idee erano ben lontane dalle comuni pratiche di programmazione dettate dall'hardware disponibile alla fine degli anni '1950.
Nel corso del tempo, il linguaggio predefinito, incarnato dal successo dei linguaggi più diffusi, si è gradualmente evoluto verso Lisp. I punti da 1 a 5 sono ormai ampiamente adottati. Il punto 6 sta iniziando ad apparire nel linguaggio di programmazione mainstream. Python presenta una qualche forma del punto 7, sebbene manchi della sintassi appropriata. Il punto 8, che (insieme al punto 9) rende possibili le macro in Lisp, è ancora esclusivo di Lisp, probabilmente perché (a) richiede quelle parentesi o qualcosa di altrettanto negativo, e (b) se si aggiunge quest'ultimo incremento di potenza, non si può più affermare di aver inventato un nuovo linguaggio, ma semplicemente di aver sviluppato un nuovo dialetto di Lisp.
Sebbene questo sia utile per i programmatori moderni, è strano descrivere il Lisp in termini di distinzione dalle tecniche casuali adottate da altri linguaggi. Forse non era questo che intendeva McCarthy. Il Lisp non fu progettato per correggere gli errori del Fortran; piuttosto, emerse come sottoprodotto di un tentativo. .
Fonte: habr.com
