«Najväčší programovací jazyk, aký bol kedy vytvorený«
— Alan Kay, „na Lisp“
Keď McCarthy koncom 1950-tych rokov vyvinul Lisp, bol radikálne odlišný od existujúcich jazykov, z ktorých najdôležitejší bol
Lisp predstavil deväť nových nápadov:
1. Podmienky. Podmienené príkazy sú konštrukcie typu if-then-other. Teraz ich berieme ako samozrejmosť. Oni boli
2. Typ funkcie. V Lispe sú funkcie prvotriedne objekty - sú dátovým typom, rovnako ako čísla, reťazce atď., a majú doslovnú reprezentáciu, môžu byť uložené v premenných, môžu byť odovzdané ako argumenty atď.
3. Rekurzia. Rekurzia, samozrejme, existovala ako matematický koncept pred Lisp, ale Lisp bol prvý programovací jazyk, ktorý ju podporoval. (Toto možno znamená vytvárať funkcie ako prvotriedne objekty.)
4. Nový koncept premenných. V Lispe sú všetky premenné efektívnymi ukazovateľmi. Hodnoty sú to, čo majú typy, nie premenné, a priraďovanie alebo viazanie premenných znamená kopírovanie ukazovateľov, nie to, na čo ukazujú.
5. Odvoz odpadu.
6. Programy zložené z výrazov. Lisp programy sú stromy výrazov, z ktorých každý vracia hodnotu. (Niektoré výrazy Lisp môžu vrátiť viacero hodnôt.) To je v kontraste s Fortranom a mnohými ďalšími úspešnými jazykmi, ktoré rozlišujú medzi „výrazmi“ a „výrokmi“.
Bolo prirodzené mať tento rozdiel vo Fortrane, pretože jazyk bol orientovaný na riadky (nie je prekvapujúce pre jazyk, ktorého vstupným formátom bola dierna karta). Nemohli ste mať vnorené príkazy. A pokiaľ ste potrebovali matematické výrazy, aby fungovali, nemalo zmysel, aby čokoľvek iné vracalo hodnotu, pretože na vrátenie nemusí nič čakať.
Obmedzenia boli zrušené s príchodom blokovo štruktúrovaných jazykov, ale vtedy už bolo neskoro. Rozdiel medzi výrazmi a tvrdeniami už bol stanovený. Prešiel z Fortranu do Algolu a ďalej na ich potomkov.
Keď sa jazyk skladá výlučne z výrazov, výrazy môžete skladať ľubovoľným spôsobom. Môžete napísať buď (pomocou syntaxe
(if foo (= x 1) (= x 2))
alebo
(= x (if foo 1 2))
7. Typ symbolu. Znaky sa líšia od reťazcov, v takom prípade môžete skontrolovať rovnosť porovnaním ukazovateľov.
8. Zápis pre kód pomocou stromov symbolov.
9. Celý jazyk je vždy k dispozícii. Neexistuje žiadny zjavný rozdiel medzi časom čítania, časom kompilácie a časom spustenia. Môžete kompilovať alebo spúšťať kód počas čítania alebo čítať alebo spúšťať kód počas kompilácie alebo čítať alebo kompilovať kód počas jeho spustenia.
Spustenie kódu počas čítania umožňuje používateľom preprogramovať syntax Lisp; spustenie kódu v čase kompilácie je základom pre makrá; runtime kompilácia je základom pre používanie Lisp ako rozširujúceho jazyka v programoch ako Emacs; a nakoniec, čítanie v režime runtime umožňuje programom komunikovať pomocou s-výrazov, čo je myšlienka, ktorá sa nedávno objavila v XML.
Záver
Keď bol Lisp prvýkrát vynájdený, tieto myšlienky boli ďaleko od konvenčných programovacích praktík diktovaných hardvérom dostupným na konci 1950. rokov.
Postupom času sa štandardný jazyk, stelesnený úspechom populárnych jazykov, postupne vyvinul smerom k jazyku Lisp. Body 1-5 sú teraz všeobecne akceptované. Bod 6 sa začína objavovať v hlavnom prúde. V Pythone existuje klauzula 7 v určitej forme, hoci neexistuje vhodná syntax. Položka 8, ktorá (s položkou 9) umožňuje makrá v jazyku Lisp, je stále iba v jazyku Lisp, pravdepodobne preto, že (a) vyžaduje tieto zátvorky alebo niečo rovnako zlé a (b) ak pridáte toto najnovšie zvýšenie výkonu, môžete už netvrdiť, že vynašiel nový jazyk, ale len že vyvinul nový dialekt Lisp; -)
Hoci je to užitočné pre moderných programátorov, je zvláštne popisovať Lisp z hľadiska jeho rozdielu od náhodných techník používaných v iných jazykoch. Toto nemusí byť to, čo si McCarthy myslel. Lisp nebol navrhnutý na opravu Fortranových chýb; javilo sa to skôr ako vedľajší produkt pokusov
Zdroj: hab.com