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ň