Základní funkce -=-=-=-=-=-=-=-=- We don't need no flow control We don't need no load control No data typing or declarations No link edit for external bindings Hey! did you leave the lists alone? Hey! did you leave that source alone? Chorus: (Chorus) Oh No. It's just a pure LISP function call. We don't need no side-effecting We don't need no allocation We don't need no flow control We don't need no special-nodes No global variables for execution No dark bit-flipping for debugging Hey! did you leave the args alone? Hey! did you leave those bits alone? (Chorus) (Chorus) -- "Another Glitch in the Call", a la Pink Floyd Můžeme experimentovat dál. Známe ještě jeden atomický typ - symbol: ==> (write ahoj) Error: 'ahoj' is undefined. Co se to stalo? Jak jsem říkal parametry se napřed vyhodnocují. Symboly se vyhodnocují do hodnot přoměných jim přiřazených. Zatím ale proměné neznáme a tak jsme symbolu ahoj žádnou proměnou nepřiřadili. Proto eval selhal. Jak ale vypsat symbol? Je nutné zabránit jeho vyhodnocení. K tomu existuje speciální konstrukce quote. Narozdíl od funkcí, quote své parametry nevyhodnocuje. Proto stačí napsat: ==> (quote ahoj) ahoj ==> (write (quote ahoj)) ahoj () A vše funguje jak má - (quote ahoj) se vyhodnotí do symbolu ahoj a ten se vypíše. Funkce quote je vlastně pravým opakem funkce eval. Její účinek lze tedy zrušit přidáním volání eval: ==> (write (eval (quote ahoj))) Error: 'ahoj' is undefined. Tady se napřed zavolal eval implicitně - tedy pro volání funkce write. Uviděl list (eval (quote ahoj)) a začal jej vyhodnocovat. Další eval se zavolal pro jednotlivé části listu. Výsledný (quote ahoj) je opět list. Ten se vyhodnotí do ahoj. Tedy druhý list se vyhodnotil do (eval ahoj). No a tento eval už selhal. Není to snadné? Protože je quote dost často používaná funkce, autoři se nad námi smilovali a udělali zjednoduššení syntaxe. 'ahoj je přesně to samé co (quote ahoj). Do skupiny základních funkcí, o kterých bych tu rád napsal patří ještě dvě důležite funkce - car a cdr. Ty slouží k vyzvednutí stejnojmených částí z consy. Tedy například: ==> (car '(10 . 20)) 10 Ten apostrof je tam nutný. Jinak by se cons začala vyhodnocovat jako list a vyhodnocování by selhalo. (funkce 10 neexistuje). Ještě nekolik příkladů: ==> (car '(1 2 3)) 1 ==> (car '((1 2) 3)) (1 2) ==> (cdr '(1 2 3)) (2 3) ==> (cdr '((1 2) 3)) (3) ==> (cdr '(1)) () Ten, kdo dával pozor jistě ví o co jde. Důležité je si ovětomit, že car u listů vrátí jejich hlavu, zatímco cdr hlavu užízne. Každý dialekt lispu má bohatou sadu funcí pro práci se seznamy. Později o některých z nich napíšu. Nakonec vám ještě prozradím, že jsou také funkce na aritmetiku jako + apod. Aritmetika v lispu se píše prefixově: ==> (+ 1 2) 3 ==> (+ 1 (* 3 4)) 13 ==> (+ 1 2 3 4 5) 15 Jak vidíte, funkce mají proměný počet parametrů. výheň