«Największy z kiedykolwiek stworzonych języków programowania«
— Alan Kay, «on Lisp»

Kiedy McCarthy opracował Lisp pod koniec lat 50., różnił się on radykalnie od istniejących języków, z których najważniejszym był .
Lisp wprowadził dziewięć nowych idei:
1. Wyrażenia warunkowe (Conditionals). Wyrażenia warunkowe to konstrukcja if-then-else. Teraz uważamy je za oczywiste. Zostały one przez McCarthy'ego w czasie opracowywania LISP. (Fortran w tym czasie miał tylko instrukcje goto, ściśle związane z instrukcją warunkową opartą na sprzęcie.) McCarthy, będąc w komitecie Algol, wprowadził wyrażenia warunkowe do Algol, skąd rozprzestrzeniły się na inne języki.
2. Typy funkcjonalne (A function type). W Lispie funkcje to obiekty pierwszej klasy — są typem danych, tak jak liczby, ciągi itp., mają literalne przedstawienie, mogą być przechowywane w zmiennych, mogą być przekazywane jako argumenty itd.
3. Rekurencja (Recursion). Rekurencja oczywiście istniała jako koncepcja matematyczna przed LISPem, ale Lisp był pierwszym językiem programowania, który ją wspierał. (Jest to prawdopodobnie zasugerowane przez stworzenie funkcji jako obiektów pierwszej klasy.)
4. Nowa koncepcja zmiennych (A new concept of variables). W Lispie wszystkie zmienne są efektywnymi wskaźnikami. Wartości są tym, co mają typy, a nie zmienne, a przypisanie lub powiązanie zmiennych oznacza kopiowanie wskaźników, a nie tego, na co one wskazują.
5. Garbage-collection (Garbage-collection).
6. Programy składają się z wyrażeń (Programs composed of expressions). Programy w Lispie to drzewa wyrażeń, każde z nich zwraca wartość. (Niektóre wyrażenia Lisp mogą zwracać wiele wartości.) Jest to w kontrast do Fortranu i wielu innych popularnych języków, które rozróżniają "wyrażenia" i "polecenia".
Naturalnym było posiadanie takiego rozróżnienia w Fortranie, ponieważ język ten był zorientowany liniowo (co nie jest zaskakujące dla języka, którego formatem wejściowym była karta dziurkowana). Nie można było mieć zagnieżdżonych poleceń. A dopóki potrzebne były wyrażenia matematyczne do pracy, nie było sensu zmuszania czegokolwiek innego do zwracania wartości, ponieważ mogło nie być niczego, co by oczekiwało zwrotu.
Ograniczenia zostały zniesione wraz z pojawieniem się języków blokowo-strukturalnych, ale w tym momencie było już za późno. Różnica między wyrażeniami a stwierdzeniami już się ugruntowała. Przeszła od Fortrana do Algola i dalej do ich potomków.
Kiedy język jest całkowicie zbudowany z wyrażeń, możesz konstruować wyrażenia według własnego uznania. Możesz napisać albo (używając składni )
(if foo (= x 1) (= x 2))lub
(= x (if foo 1 2))7. Typ symbolu (A symbol type). Symbole różnią się od ciągów, w tym przypadku możesz sprawdzić równość, porównując wskaźniki.
8. Notacja dla kodu (A notation for code) z wykorzystaniem drzew z symboli.
9. Cały język zawsze dostępny (The whole language always available). Nie ma wyraźnego rozróżnienia między czasem odczytu, czasem kompilacji a czasem wykonania. Możesz kompilować lub uruchamiać kod w trakcie odczytu, lub czytać lub uruchamiać kod podczas kompilacji, lub czytać lub kompilować kod w trakcie wykonania.
Uruchamianie kodu w trakcie odczytu pozwala użytkownikom zmieniać składnię Lispa; uruchamianie kodu w trakcie kompilacji jest podstawą dla makr; kompilacja w trakcie wykonania to podstawa wykorzystania Lispów jako języka rozszerzenia w takich programach jak Emacs; a wreszcie, odczyt w trakcie wykonania pozwala programom na interakcję z użyciem s-wyrażeń, pomysł, który został niedawno na nowo wynaleziony w XML.
Podsumowanie
Kiedy Lisp został wynaleziony, wszystkie te pomysły były dalekie od powszechnych praktyk programistycznych, które narzucały maszyny dostępne pod koniec lat 50.
Z biegiem czasu język domyślny, ucieleśniony w sukcesie popularnych języków, stopniowo ewoluował w kierunku Lispa. Punkty 1-5 są teraz szeroko rozpowszechnione. Punkt 6 zaczyna się pojawiać w mainstreamie. W Pythonie w pewnym sensie istnieje punkt 7, chociaż odpowiednia składnia nie jest dostępna. Punkt 8, który (z punktem 9) umożliwia makra w Lispie, wciąż występuje tylko w Lispie, prawdopodobnie dlatego, że (a) wymaga tych nawiasów lub czegoś równie złego, oraz (b) jeśli dodasz to ostatnie zwiększenie mocy, nie możesz już twierdzić, że wynalazłeś nowy język, a tylko, że opracowałeś nowy dialekt Lispa; -)
Chociaż to pomocne dla współczesnych programistów, dziwnie jest opisywać Lisp w kontekście jego różnic z losowymi technikami stosowanymi w innych językach. Może to nie jest to, o czym myślał McCarthy. Lisp nie został zaprojektowany, aby naprawić błędy Fortrana; pojawił się raczej jako produkt uboczny próby .
Źródło: habr.com
