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ň