Archiv pro štítek: Scheme

Scheme

Scheme

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.