Typy -=-=-=- God is real, unless declared integer. Scheme zná několik typů. Nejzákladnější jsou atomické typy. Jak jméno napovídá, jedná se o základní nedělitelné typy. Základní atomy ve Scheme jsou: číslo číslo může být jak celé tak desetiné. (například 27, nebo 3.14159). Čísla se vždycky vyhodnocují samy do sebe. nil Zase typ, kerý se vyhodnocuje sám do sebe. Znamená prázdný seznam, ale o tom až později symbol Symbol je libovolná posloupnost znaků (například ahoj). Symboly se vyhodnocují do hodnoty proměné, která jim odpovídá. Scheme podporuje i další atomy (stringy apod.) ale zatím to není důležité. Scheme má jediný důležitý složený typ. Tím je cons. Není to ale žádný komplikovaný typ, ale ten nejjednodušší, co si dokážete představit. Jako struktura v C může obsahovat několik hodnost. Ale narozdíl od C obsahuje právě dvě hodnoty. První hodnota se jmenuje car, druhá cdr. To je z historických důvodů. Na počítači, kde byl Lisp implementován byl registr dělen do dvou části (context address register a context data register). Zápis cons je násedující: ( první hodnota . druhá hodnota ). Například: (10 . ahoj) Je cons obsahující 10 na pozici cdr a symbol ahoj na pozici car. První i druhá hodnota může být libovolného typu, tedy i cons. Ale to už je další kapitola: Listy -=-=-=- A list is only as strong as its weakest link. -- Don Knuth Listy vznikají spojením cons. Protože hodnota může být opět cons, můžu napsat třeba: ((10 . 20) . (50 . 20) Ale to už nahrává k nejdůležitější konstrukci Lispu - listům (jednosměrně vázaným seznamům). Pokud car bude vždy obsahovat hodnotu a cdr odkaz na další cons (další hodnotu v seznamu), můžu vytvořit klasický list. Za konec seznamu se považuje odkaz na nil (prázdný seznam). Tedy například: (10 . (20 . (30 . nil))) Je seznam obsahující hodnoty 10, 20 a 30. Aby se ale ušetřilo závorek, funguje i zkrácený zápis: (10 20 30) Samozřejmě, že listy mohou obsahovat i další listy: (10 (20 20 30) 30) apod. No a právě list je nejdůležitější věc Lispu. (Lisp se podle něj i jmenuje. Název znamená List procesing language) List má totiž speciálně zadefinované vyhodnocování. Pokud se narazí na cons, první hodnota se bere jako jméno funkce a další jeko její parametry. My zatím známe pouze funkce read, write a eval. Hned si tu můžeme vyzkoušet jejich chování: ==> (write 50) 50 () Co to znamená? No já jsem zadal list (write 50). Interpretr si ho přebral takto: write - symbol, po vyhodnocení dostal funkci, 50 - číslo, po vyhodnocení dostal zase číslo. Zavolal tedy write(50). Ta vypsala hodnotu 50 na obrazovku. protože ale musí něco vrátit, vrátila nil. Jak jsem už říkal, nil znamená prázdný seznam. (může se tedy zapisovat i jako ()) výheň