Common Lisp

Common Lisp je v informatice rozšíření funkcionálního programovacího jazyka Lisp, který je zveřejněn v ANSI (American National Standards Institute). Common Lisp byl vyvinut kvůli sjednocení odlišných variant Lispu. Jedná se o jazyk, který využívá procedurální, funkcionální 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é

K nastavení proměnných slouží příkaz setq.

(setq a 1)

nastaví vazbu symbolu a na hodnotu 1. Lokální proměnné se nastavují příkazem let.

(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

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 - 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ý typ - 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 subtyp 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 - Je 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

  • real - Je 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 - Je 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 - Je 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 - Je subtyp od real; Jedná se o obecný datový typ čísla s plovoucí řádovou čárkou.
  • integer - Je 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

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

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:

  • řetězec – vektor znaků
  • bit-vektor – vektor bitů

Příklady vytvoření pole:

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

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

Definice funkcí

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

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))

Externí odkazy