Common Lisp

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Common Lisp je v informatice rozšířením funkcionálního programovacího jazyku Lisp, který je zveřejněn v ANSI (American National Standards Institute). Common Lisp by vyvinut kvůli sjednocení odlišných variant Lispu. Jedná se o jazyk, který využívá procedurální, funkční a objektově-orientované programovací paradigmata. Obsahuje sadu nástrojů pro objektově orientované programování. Další rozšiřující dialekty jsou s Common Lisp kompatibilní (cmlisp, elisp, autolisp atd.).

Proměnné[editovat | editovat zdroj]

K nastavení proměnných slouží příkaz setq. Lokální proměnné se nastavují příkazem let.

(setq a 1)

nastaví vazbu symbolu a na hodnotu 1

(let ((b 8)) b)

vytvoří lokální prostředí a v něm nastaví vazbu symbolu b na 8. Poté vrátí hodnotu symbolu b. (Což je v daném prostředí 8.)

Typy[editovat | editovat zdroj]

Podrobnější informace naleznete v článku Datový typ.

Common Lisp obsahuje mnoho datových typů, které jsou vzájemně uspořádány do stromové struktury.

Ke každému netriviálnímu datovému typu existuje většinou stejnojmenná funkce pro vytvoření prvku daného typu, nebo lze daný prvek (např. číslo) rovnou zapsat v podobě čitelné readerem.

t
t je základním typem, veškeré typy jsou subtypem tohoto typu
nil
Reprezentuje nepravdu nebo prázdný seznam. Je subtypem všech ostatních typů, žádný objekt nemůže být typu nil.
null
Reprezentuje prázdný seznam - je subtypem seznamu, a reprezentuje prázdný seznam zapsatelný jako
()
symbol
Symboly představují jméno např. hodnoty nebo funkce. Jeden symbol může být současně jménem více takovýchto entit. Symboly mají jména jimiž se zobrazují. Jméno symbolu je běžně libovolná posloupnost znaků, nevypadající jako číslo, neobsahující ':' nebo neskládající se z teček. Symboly mohou být sdružovány v packages.
function
je datovým typem - elementem jazyka. To kromě jiného znamená, že ji lze např. předávat jiným funkcím jako argument nebo vracet jako výsledek jiných funkcí.
boolean
je subtypem symbolu, a sestává z dvou hodnot - t a nil reprezentujících true a false. Obecně platí, že cokoliv, co není nil je true.
character
neboli písmeno, představuje jeden tisknutelný znak.
number
základní číselný typ. Lze s ním provádět veškeré běžné aritmetické operace (+, -, /, *, exp, sqrt, abs...) a základní porovnání (=) pro zjištění číselné rovnosti.

Numerické typy[editovat | editovat zdroj]

real
Subtyp od number; Představuje reálná čísla, některá však v CL nemusí být vyjádřitelná přesně (např. iracionální čísla). Pouze čísla typu real mohou být uspořádána pomocí funkcí <, > , <= , a >=.
complex
Subtyp od number; Pomocí complex lze zapsat komplexní číslo v kartézských souřadnicích, nebo jakýkoliv předcházející číselný typ. Číslo lze přímo zadat pomocí makrocharakteru #C. např.:
#C(reálná_část imaginární_část)
rational
Subtyp od real; Používá se pro racionální čísla. Pokud se jedná o číslo celé je vnitřně uloženo pomocí typu integer, jinak pomocí typu ratio. Ratio se skládá z dvou nenulových integerů, čitatele a jmenovatele, jejichž největší společný dělitel je 1 a jmenovatel je navíc kladný a větší než 1.
float
Subtyp od real; Jedná se o obecný datový typ čísla s plovoucí řádovou čárkou.
integer
Subtyp od rational; Celočíselný datový typ. Obecně libovolné velikosti.

Existují další numerické typy jako bit či unsigned-byte a lehce lze vytvářet v případě potřeby (např. pro omezení obsahu slotů tříd) další pomocí konstrukcí (<numetický_datový_typ> [horní_limit [dolní_limit]])

Jiné typy[editovat | editovat zdroj]

Cesty představují soubory a adresáře v souborovém systému.

Vstupní a výstupní toky představují zdroj binárních a textových dat.

PRNG je pseudo-generátor náhodných čísel, který je vestavěn v Common Lisp. Náhodný objekt představuje jedno použití zdroje generátoru náhodných čísel.

Podmínky představují chyby, výjimky a jiné události na které program reaguje.

Datové struktury[editovat | editovat zdroj]

Seznamy jsou u téměř všech ostatních dialektů Lispu ve složení conses. Tato datová struktura obsahuje dva sloty car, cdr (podle "contents of address register" a "contents of decrement register").

  • (cons 3 1) - vytvoří cons a nastaví car na 3 a cdr na 1.

Pole je číselný typ. Vytváří se pomocí funkce make-array. Pomocí funkce aref se do něho přistupuje. Je zde i podpora vícerozměrných polí, které lze využít pro matice při matematických operacích. Velikost pole lze dynamicky měnit v případě potřeby. Jednorozměrné pole je vektor. Jednotlivé prvky pole mohou být jakékoliv typu (i smíšené typy v jednom poli). Dva typy polí dle obsahu:

Příklad vytvoření pole:

  • (make-array '(2 2)) – dvourozměrné pole (2x2).
  • (make-array 4) – jednorozměrné pole (4 prvky)

Hash tabulky ukládají data spolu s jejich asociacemi. Každý objekt v hash tabulce má svůj klíč (key) a k němu příslušnou hodnotu (value).

Balíčky jsou symboly, které se užívají k oddělení jednotlivých částí programu. Samotný balíček může exportovat některé symboly jako součást rozhraní. Balíček může sám užívat i jiné balíčky.

Struktury představují libovolné komplexní datové struktury s libovolným počtem a typem polí (nazývají se sloty). Struktury umožňují jednoduchou dědičnost.

Třídy jsou podobné jako struktury. Nabízejí více dynamických vlastností a vícenásobnou dědičnost. Třídy byly do Common Lisp přidány až později. Objekty vytvořené třídy se nazývají instance.

Funkce[editovat | editovat zdroj]

Definice funkcí[editovat | editovat zdroj]

Common Lisp podporuje funkce první třídy. Definice funkcí pomocí makra defun. V definici je uveden název funkce, všechny argumenty funkce a tělo funkce.

(defun název_funkce (argumenty) tělo_funkce)

Místní funkce mohou být definovány pomocí příkazů flet a labels.

(flet název_funkce (argumenty) tělo_funkce)

Definice generické funkce a metody[editovat | editovat zdroj]

Metody se definují pomocí makra defmethod.

  • (Defmethod název metody (tělo metody))

Generické funkce jsou kolekcí metod. Tyto funkce se definují pomocí makra defgeneric.

  • (Defgeneric název funkce (tělo funkce))