Tento článek představuje základní konstrukty jazyka Scheme. Uvedené informace se skvěle hodí k získání povědomí o některých dostupných procedurách a vybraných rysech jazyka.
Quote a quasiquote
Quote zabrání vyhodnocení výrazu. Lze zkráceně zapsat jako uvozoku ‚. Zápisy ‚szj.cz a (quote szj.cz) jsou tedy naprosto totožné. Quasiquote se chová shodně jako quote, můžeme si ale vyžádat vyhodnocení vybrané části výrazu. Ke zkrácení se používá symbol `.
‚szj.cz => szj.cz
(quote szj.cz) => szj.cz
`szj.cz => szj.cz
(quasiquote szj.cz) => szj.cz
Unquote a unquote-splicing
Z předchozího se může zdát, že mezi quote a quasiquote neexistuje rozdíl. Tak tomu však není. U výrazu uzavřeného v quasiquote vynutí unquote (zapisovano jako čárka „,„) vyhodnocení následující části.
`(szj.cz (+ 1 1) cz.szj) => (szj.cz (+ 1 1) cz.szj)
`(szj.cz ,(+ 1 1) cz.szj) => (szj.cz 2 cz.szj)
Quasiquote tedy označuje úsek, jenž se nikdy nezmění. Naopak tomu unquote symbolizuje přesný opak.
Dále lze využít unquote-splicing (symbol ,@) chovající se jako unquote, ale s výraznou změnou – výsledný seznam ztratí své vnější závorky.
`(,@`(1 2 3)) => (1 2 3)
Všechny dosud uvedené konstrukty obsahující ve svém názvu quote lze vzájemně vnořovat a kombinovat.
`(szj.cz `cz.szj 10) => (szj.cz `cz.szj 10)
`(szj.cz ,`cz.szj 10) => (szj.cz cz.szj 10)
Povšimněte si, že v následujícím zápisu nedojde k sečtení čísel 1 a 1.
`(szj.cz `(,(+ 1 1) cz.szj) 10) => (szj.cz `(,(+ 1 1) cz.szj) 10)
Unquote zde nebude fungovat, protože se nachází uvnitř druhého quasiquote nikoliv prvního. Po drobné úpravě však dosáhneme kýženého výsledku. Povolíme funkci druhého quasiquote a vše se již chová dle našeho přání.
`(szj.cz ,`(,(+ 1 1) cz.szj) 10) => (szj.cz (2 cz.szj) 10)
Seznam
Každý seznam se skládá ze dvou složek. K té první se přistupuje s pomocí car, druhou část vrátí cdr.
(car ‚(1 . 2)) => 1
(cdr ‚(1 . 2)) => 2
Pokud je druhá složek seznam, vypouští se tečka a závorky příležící k tomuto seznamu. Oba následující zápisy jsou proto totožné.
‚(((1))) => (((1)))
‚(((1).()).()) => (((1)))
O konstrukci páru se stará cons (bere v parametrech první a druhou složku).
(cons (cons (cons 1 ‚()) ‚()) ‚()) => (((1)))
(cons (cons 1 2) (cons 3 4)) => ((1 . 2) . (3 . 4)) => ((1 . 2) 3 . 4)
Car a cdr lze vzájemně sdružovat s pomocí předdefinovaných zkratek – např. cadr nejprve vykoná cdr a poté car, postupuje se tedy obráceně.
(cadr (cons (cons 1 2) (cons 3 4))) => 3
Build-list
Jako první parametr je očekávána délka budovaného seznamu, druhý parametr symbolizuje procedura, jenž bude aplikována na každý prvek nově vznikajícího seznamu, přičemž indexování začíná od nuly.
(build-list 5 -) => (0 -1 -2 -3 -4)
List-ref
Ze zadaného seznamu vrátí prvek na dané pozici. Indexování začíná od nuly.
(list-ref ‚(a b c d) 1) => b
Reverse a length
Jak již název napovídá, length zjišťuje délku seznamu, zatímco reverse provádí obrácení pořadí prvků.
(reverse ‚(a b c d)) => (d c b a)
(length ‚(a b c d)) => 4
Append
Vytváří nový seznam spojením libovolného množství zadaných seznamů.
(append ‚(1 2) ‚(3 4) ‚(5 6)) => (1 2 3 4 5 6)
Map
Aplikuje danou proceduru na každý prvek seznamu a vrátí výsledný seznam.
(map – ‚(1 2 3 4 5)) => (-1 -2 -3 -4 -5)
Pokud je zadáno více seznamů, prochází se postupně od začátku.
(map + ‚(1 2 3 4 5) ‚(1 2 3 4 5)) => (2 4 6 8 10)
Tento výčet nesymbolizuje to jediné, co jazyk Scheme nabízí. Jeho možnosti jdou totiž mnohem dál. K vyzkoušení uvedených příkladů potřebujete vhodný interpret, například Racket.