Lisp
Straipsnis iš Vikipedijos, laisvosios enciklopedijos.
Lisp (angl. List Processing) - programavimo kalbų šeima. Sukurta praeito amžiaus šešto dešimtmečio gale kaip abstrakti rekursinių funkcijų užrašymo forma, kalba vis dar naudojama įvairiose srityse, taip pat ir kompiuterių mokslo studijose. Šiuo metu populiariausi Lisp dialektas yra Common Lisp ir Scheme.
Pagrindinė duomenų struktūra Lisp kalboje - sąrašas. Lisp kalba parašytos programos lengvai atpažįstamos iš unikalaus skliaustelių naudojimo bei prefiksinės formos.
[taisyti] Istorija
Pirmą kartą aprašyta 1958 metais, kalba yra antra pagal senumą iš aukšto lygio programavimo kalbų - tik Fortran kalba yra senesnė. Kalbą sukūrė John McCarthy 1958 metais, o viešai paskelbė 1960.
[taisyti] Savybės
Lisp kalboje viskas užrašoma išraiškomis, tiek kodas, tiek ir duomenys. Kiekviena išraiška sukuria rezultatą (ar rezultatų sąrašą), kuris gali būti naudojamas kitose išraiškose. Kadangi funkcijos užrašomos kaip sąrašai, jas galima keisti kaip duomenis, todėl labai paprasta programos veikimo metu keisti programą ar dinamiškai kurti algoritmus.
Lisp naudojama prefiksinė užrašymo forma, todėl išraiška 1+2+3+4 Lisp kalboje atrodytų taip:
(+ 1 2 3 4)
Daugumoje Lisp dialektų, funkcijos yra pirmos klasės objektai, kas reiškia, kad jas galima vartotoi ten pat, kaip ir kitus objektus. Pavyzdžiui, funkciniame programavime esminės funkcijos yra "map" ir "filter". Funkcijos "map" argumentai yra funkcija bei sąrašas. Ji kiekvienam sąrašo elementui pritaiko funkciją, ir grąžina naują sąrašą. Pavyzdys:
(defun twice (x) (* x 2)) (map #'twice '(1 2 3 4 5)) => (2 4 6 8 10)
Ypač naudinga tai, kad galima kurti anonimines funkcijas ("lambda"). Pavyzdžiui, ankstesnį pavyzdį galima būtų parašyti taip:
(map #'(lambda (x) (* x 2)) '(1 2 3 4 5))
Dauguma šiuolaikinių Lisp sistemų turi gausias bibliotekas (pvz., Common Lisp). Kitos, kaip kad Scheme pasirinko kitą kelią -- joms svarbiau sintaksės paprastumas ir aiškumas.
[taisyti] Pavyzdys
Rekursinis faktorialo skaičiavimo algoritmas:
(defun factorial (n) (if (<= n 1) 1 (* n (factorial (- n 1)))))