Array ( [0] => 15482270 [id] => 15482270 [1] => cswiki [site] => cswiki [2] => Lisp [uri] => Lisp [3] => [img] => [4] => [day_avg] => [5] => [day_diff] => [6] => [day_last] => [7] => [day_prev_last] => [8] => [oai] => [9] => [is_good] => [10] => [object_type] => [11] => 1 [has_content] => 1 [12] => [oai_cs_optimisticky] => ) Array ( [0] => '''Lisp''' (historicky '''LISP''') je rodina multiparadigmatických [[programovací jazyk|programovacích jazyků]] s dlouhou historií. Jeho název je zkratka pro '''''Lis'''t '''p'''rocessing'' (''zpracování seznamů''). Přestože se jedná spíše o akademický jazyk, používá se i na reálných projektech, např. v oboru [[umělá inteligence|umělé inteligence]]. Používá ho také například [[textový editor]] [[Emacs]] či konstrukční program [[AutoCAD]]. [1] => [2] => Lisp byl původně specifikován v roce 1958. V současné době se jedná o druhý nejstarší vysokoúrovňový jazyk, který se stále ještě používá v praxi; starší už je pouze [[Fortran]]. Lisp byl původně navržen jako programovací jazyk pro matematické výpočty a byl silně ovlivněn syntaxí [[Lambda kalkul]]u. Rychle se stal favorizovaným programovacím jazykem ve světě [[Umělá inteligence|umělé inteligence]]. Lisp se stal průkopníkem v mnoha programových technikách, například: [[Strom (datová struktura)|stromové struktury]], [[Garbage collector|automatická správa paměti]] nebo dynamické typování. Lisp nevnímá rozdíl mezi kódem a daty, díky čemuž má jednoduchou syntaxi. Celý program je tak složen z s-výrazů nebo ozávorkovaných seznamů ve tvaru (f a b c), kde na prvním místě je operátor/funkce a na dalších argumenty funkce. Všechny další funkce jazyka mají identickou syntaxi. [3] => [4] => Z Lispu jsou odvozeny i další jazyky – například [[Tcl]], [[Smalltalk]] nebo [[Scheme]]. Tvůrcem jazyka byl [[John McCarthy]]. [5] => [6] => == Syntaxe == [7] => [8] => Základním zápisem v Lispu je seznam. Zapisuje se tímto způsobem: [9] => [10] => (1 2 "ahoj" 13.2) [11] => [12] => [13] => Tento seznam obsahuje čtyři prvky: [14] => * celé číslo 1 [15] => * celé číslo 2 [16] => * řetězec znaků „ahoj“ [17] => * reálné číslo 13,2 [18] => [19] => Seznam v příkladu reprezentuje uspořádanou čtveřici. Závorky v jazyce Lisp nefungují tak jako v [[matematika|matematice]], ale pouze označují začátek a konec seznamu. [20] => [21] => Seznamy jsou v Lispu implementovány jako [[binární strom]] degenerovaný na jednosměrný [[spojový seznam]]. [22] => [23] => Co se seznamem Lisp udělá, záleží na okolnostech. [24] => [25] => === Příkazy === [26] => Příkazy jazyka Lisp se zapisují také jako seznam, jehož první prvek seznamu je název příkazu. [27] => [28] => Například sčítání je realizováno příkazem '''+'''. Odpovídající konstrukce v jazyce vypadá takto: [29] => [30] => (+ 1 2 3) [31] => [32] => [33] => Interpret odpoví '''6'''. [34] => [35] => == Ukázka kódu == [36] => Program [[hello world]] lze zapsat několika způsoby. Nejjednodušší vypadá takto: [37] => [38] => (format t "Hello, World!") [39] => [40] => [41] => Funkce se v Lispu definují klíčovým slovem ''defun'': [42] => [43] => (defun hello () [44] => (format t "~&Hello, World!~%")) [45] => (hello) [46] => [47] => [48] => Na prvních dvou řádcích je definice funkce ''hello'', na třetím řádku je tato funkce svým jménem zavolána. [49] => [50] => Funkcím lze předávat i argumenty. V následujícím příkladu je ukázka funkce ''fact'', která vypočítá [[faktoriál]] zadaného čísla: [51] => [52] => (defun fact (n) [53] => (if (zerop n) [54] => 1 [55] => (* n (fact (- n 1))))) [56] => [57] => [58] => Pro výpočet faktoriálu čísla 6 předáme tuto hodnotu jako argument funkci fact: [59] => [60] => (fact 6) [61] => [62] => [63] => Návratovou hodnotou funkce bude hodnota 720. [64] => [65] => == Makra == [66] => Lisp má jako jeden z mála jazyků propracovaný systém maker, díky kterým lze velmi výrazným způsobem ovlivnit celý jazyk. Makra jsou nejprve načtena v READ části REPLu, následně je provedena makroexpanze (tu provádí preprocesor) a až poté je celý výraz vyhodnocen běžnou EVAL částí. Nemá smysl uvažovat o aplikaci makra, v době vyhodnocení výrazu již žádné makro neexistuje. Makro pouze přepisuje text/kód předtím, než se předhodí k vlastnímu vyhodnocení. Zásadní rozdíl mezi makrem a funkcí pak je, že makro nevyhodnocuje své argumenty při zavolání funkce. [67] => [68] => === Quote, Unquote, Quasiquote === [69] => Abychom mohli makra vůbec používat, musíme mít nějaké nástroje k transformaci kódu. Běžně se používá speciální operátor quote, který vrátí následný výraz tak jak mu ho předáme — žádnou část nevyhodnotí. Jako syntaktickou zkratku můžeme použít apostrof '. [70] => [71] => [72] => ;; Mohlo by se zdát, že quote není potřebný operátor, když máme list, [73] => ;; ale jak je vidět, je mezi nimi zásadní rozdíl — funkce list vyhodnocuje [74] => ;; všechny své argumenty, quote nevyhodnotí nic. [75] => > (quote (1 2 3)) [76] => (1 2 3) [77] => [78] => > (list 1 2 3) [79] => (1 2 3) [80] => [81] => > (quote (1 (+ 2 3 4) 5)) [82] => (1 (+ 2 3 4) 5) [83] => [84] => > (list 1 (+ 2 3 4) 5) [85] => (1 9 5) [86] => [87] => > (quote (a b c d)) [88] => (A B C D) [89] => [90] => > (list a b c d) [91] => Error: The variable A is unbound. [92] => [93] => > '(1 2 3) [94] => (1 2 3) [95] => [96] => [97] => Abychom mohli i kvotované části nechat něco vyhodnotit, musíme mít mechanismus, kterým zrušíme ono kvotování a vrátíme se zpět k vyhodnocování. K tomu slouží speciální operátory unquote a quasiquote. Quasiquote se chová stejně jako quote, pouze s tím rozdílem, že ve svém těle umožňuje použít unquote, který vyhodnotí daný výraz. Syntaktická zkratka pro unquote je čárka , a pro quasiquote zpětný apostrof `. [98] => [99] => [100] => > `(1 2 ,(+ 3 4)) [101] => (1 2 7) [102] => [103] => > `(list 1 2 ,(list 3 4)) [104] => (LIST 1 2 (3 4)) [105] => [106] => > `('a 'b ,(list (+ 1 2) (+ 3 4)) c d) [107] => ((QUOTE A) (QUOTE B) (3 7) C D) [108] => [109] => [110] => === Základní práce s makry === [111] => Makra se vytvářejí pomocí speciálního operátoru defmacro. Nejjednodušší příklad může být definice vlastní podmínky, vlastního ifu. Pomocí makra by to vypadalo následovně: [112] => [113] => [114] => (defmacro my-if (cond true false) [115] => `(if ,cond [116] => ,true [117] => ,false)) [118] => [119] => [120] => Makro se chová stejně jako běžný if: [121] => [122] => [123] => > (my-if 1 2 3) [124] => 2 [125] => [126] => ;; Makro vrátí dvě jedničky, protože jednou se vytiskne [127] => ;; a jednou se vrátí jako výsledek funkce print. [128] => > (my-if 1 (print 1) (print 2)) [129] => 1 [130] => 1 [131] => [132] => > (my-if nil (print 1) (print 2)) [133] => 2 [134] => 2 [135] => [136] => [137] => Při definici „vlastního“ ifu musíme použít makro, protože nevyhodnocuje své argumenty. Kdybychom nadefinovali if jako funkci, nechovalo by se to stejně, protože argumenty už by se vyhodnotily při volání funkce a tím pádem by se vždy vyhodnotily obě větve podmínky. [138] => [139] => [140] => (defun my-bad-if (cond true false) [141] => (if cond [142] => true [143] => false)) [144] => [145] => ;; Příklady volání: [146] => [147] => ;; Zde proběhne vyhodnocení správně [148] => > (my-bad-if 1 2 3) [149] => 2 [150] => [151] => ;; Při tomto volání se chybně vytiskne jedna šestka [152] => > (my-bad-if 1 (print 5) (print 6)) [153] => 5 [154] => 6 [155] => 5 [156] => [157] => [158] => === Problémy spojené s makry === [159] => Při používání maker si musíme dávat pozor na dva klasické problémy – '''dvojí vyhodnocení''' a '''symbol capture'''. Představme si if, který v true větvi automaticky vrátí výsledek podmínky a ve false větvi vrátí předaný argument. Ukázka, jak by to mělo fungovat: [160] => [161] => [162] => ; 1 je true, tak vrátí 1 [163] => > (if-false 1 2) [164] => 1 [165] => [166] => ; Výsledný seznam je true, vrátí seznam [167] => > (if-false (member 2 '(1 2 3 4 5)) 'nic) [168] => (2 3 4 5) [169] => [170] => ; nil je false, vrátí symbol nic [171] => > (if-false (member nil '(1 2 3 4 5)) 'nic) [172] => NIC [173] => [174] => [175] => Naivní implementace by mohla vypadat takto: [176] => [177] => [178] => (defmacro if-false-1 (cond false) [179] => `(if ,cond [180] => ,cond [181] => ,false)) [182] => [183] => [184] => Toto makro zdánlivě funguje. Ovšem do doby, než na něj pustíme kód s vedlejším efektem: [185] => [186] => [187] => ;; Funguje jak má [188] => > (if-false-1 (member 2 '(1 2 3 4 5)) 'nic) [189] => (2 3 4 5) [190] => [191] => ;; Funguje jak má [192] => > (if-false-1 (member nil '(1 2 3 4 5)) 'nic) [193] => NIC [194] => [195] => ;; Makro incf zvyšuje hodnotu symbolu o jedna. [196] => ;; Nefunguje jak má — očekáváme, že volání vrátí dvojku. [197] => > (let ((a 1)) [198] => (if-false-1 (incf a) 'nic)) [199] => 3 [200] => [201] => [202] => Kód (incf a) se v těle makra vyhodnotil dvakrát, proto nám to vrátí trojku. Kód po makroexpanzi vypadá takto: [203] => [204] => [205] => (LET ((A 1)) [206] => (IF (INCF A) [207] => (INCF A) [208] => 'NIC)) [209] => [210] => [211] => Řešením je navázat vyhodnocenou podmínku na nějaký symbol: [212] => [213] => [214] => (defmacro if-false-2 (cond false) [215] => `(let ((cond-help ,cond)) [216] => (if cond-help [217] => cond-help [218] => ,false))) [219] => [220] => [221] => Teď už se výraz vyhodnotí pouze jednou: [222] => [223] => [224] => > (let ((a 1)) [225] => (if-false-2 (incf a) 'nic)) [226] => 2 [227] => [228] => [229] => == Externí odkazy == [230] => * {{Commonscat}} [231] => * [http://www.root.cz/clanky/jemny-uvod-do-lispu Jemný úvod do LISPu] [232] => * {{en}} [http://clisp.cons.org/ ANSI Common Lisp Implementation] [233] => * {{en}} [http://www.cadforum.cz/cadforum/Vyvojove-prostredky-AutoCADu Visual LISP – vývojové prostředky AutoCADu] [234] => * {{en}} [http://www.gigamonkeys.com/book Practical Common Lisp] [235] => [236] => {{Programovací jazyky}} [237] => {{Autoritní data}} [238] => [239] => [[Kategorie:Lisp| ]] [240] => [[Kategorie:Programovací jazyky]] [241] => [[Kategorie:Funkcionální jazyky]] [] => )
good wiki

Lisp

Lisp (historicky LISP) je rodina multiparadigmatických programovacích jazyků s dlouhou historií. Jeho název je zkratka pro List processing (zpracování seznamů).

More about us

About

Expert Team

Vivamus eget neque lacus. Pellentesque egauris ex.

Award winning agency

Lorem ipsum, dolor sit amet consectetur elitorceat .

10 Year Exp.

Pellen tesque eget, mauris lorem iupsum neque lacus.

You might be interested in

,'programovací jazyk','Umělá inteligence','Kategorie:Programovací jazyky','faktoriál','spojový seznam','textový editor','Emacs','AutoCAD','Fortran','Lambda kalkul','umělá inteligence','Garbage collector'