Hlavní navigace

Scheme: kostlivec ve skřini nebo nehasnoucí hvězda?

Jakub Šťastný

Funkcionální jazyky jsou tu s námi již mnoho a mnoho desítek let. Ačkoliv se sami do běžné praxe zas až tak nedostaly, ovlivnily ostatní programovací jazyky zcela fundamentálním způsobem. Jedním z nich je i oblíbené Scheme. Jak se v něm píše? Může mi být něčím prospěšné?

Za námět na článek i cenné rady bych rád poděkoval Jakubu Hegenbartovi (Kyosuke).

Znáte Scheme?

Scheme je dialekt programovacího jazyku Lisp. Jo, to je „ta věc s těma závorkama“, přesně tak. Kromě poněkud nezvyklé syntaxe Lisp a tedy také Scheme disponuje i jinými, mnohdy velmi zajímavými a užitečnými možnostmi. Pojďme se s nimi seznámit.

Pár slov nejprve o Lispu …

Rodina lispových jazyků patří do skupiny tzv. funkcionálních jazyků. Ty jsou podmnožinou tzv. deklarativních programovacích jazyků, tedy jazyků, v nichž se programátor snaží vyjádřit, co se má udělat, a ne jak se to má udělat (viz WikiPedie). Kromě Lispu patří do deklarativních jazyků ještě například SQL, do podskupiny funkcionálních programovacích jazyků pak ještě například Haskell a Prolog.

Vlastní název Lisp pochází z List Processing, tedy zpracování seznamů, které jsou v Lispu alfou i omegou téměř všeho. Zlí jazykové však tvrdí, že to není pravda, že zkratka Lisp prý pochází z „Lots of Insanely Stupid Parenthesis“, ale to jim jistě nebudete věřit…

Počátky Lispu sahají do dávné počítačové historie, téměř až informatického pravěku – na svět totiž Lisp přišel již roku 1958, vyvinut byl pro účely programování umělé inteligence. Lisp ale našel mnohem širší použití než „jen“ při programování AI, vzpomeňme například Emacs, AutoCAD, hra Abuse, prohlížeč fraktálů XaoS a další.

Nechme ale nyní Lisp Lispem, pokud vás zajímá více, můžete si přečíst jemný úvod do Lispu nebo lispová makra, případně skočit na WikiPedii či LinuxExpres, my se budeme věnovat Scheme.

… a samozřejmě také o Scheme

Scheme je oproti Common Lispu mnohem více akademické, snaží se o co největší čistotu a poskytuje poměrně malé množství konstrukcí, na jejichž základě se staví zbytek. Spíše akademické využití dokládá také fakt, že Scheme až tolik nestaví na rychlosti, i když pravdou je, že i pro Scheme existují velmi rychlé kompilátory a interpretery, jak si ostatně povíme za chvilku.

S trochou nadsázky lze Scheme nazvat „jazykem na psaní jazyků“. Nejenže napsání interpreteru Scheme ve Scheme bývá jedním z nejčastějších úkolů při výuce Scheme na vysoké škole, ale je to také velmi lehké – lze to zvládnout doslova za chvilku. Ve Scheme lze snadno napsat nejenom pouze Scheme samotné, ale skvěle se v něm píší interpretery či kompilátory spousty dalších jazyků.

DrScheme

Vývojové prostředí DrScheme.

Žije to vůbec ještě?

Ačkoliv Scheme není využívané tak často jako Common Lisp, rozhodně má i v dnešním světě své místo na slunci. To platí především ve školství, protože velká spousta škol ve Scheme vyučuje, nicméně tu a tam se používá i v některých projektech.

Vývoj Scheme je pořád živý, jeho specifikace se vždy po několika letech aktualizuje. Poslední dosti pokroková R6RS vzbudila ostrou diskusi, takže o živosti jazyka myslím nemůže být pochyb.

Implementace

Scheme je k mání ve velké spoustě implementací, dokonce si můžete vybrat, zda je libo Scheme interpretovat či kompilovat do binárního kódu, to není problém.

Pokud si chcete Scheme nejprve prostě jenom vyzkoušet, možná nejlépe uděláte, když si nainstalujete vývojové prostředí DrScheme, které vám dodá jak interpret Scheme, tak cokoliv ostatního, co budete pro začátek potřebovat. Pokud se vám Scheme zalíbí, možná dáte raději přednost Emacsu, který, když se doplní o pár balíčků maker, je na vývoj lispových a schemových programů opravdu k nezaplacení.

Z interpretrů rozhodně stojí za zmínku Gauche Scheme, z kompilátorů zmíním alespoň Stalin, který se pyšní pozoruhodnou rychlostí – bez nadsázky lze říct, že ani binárka, která vyleze z kódu v jazyce C, nebude s velkou pravděpodobností tak rychlá jako binárka, která vyleze ze Stalina, a to i přesto, že Stalin překládá do zdrojového kódu pomocí překladu do C s teprve následnou kompilací.

Hello World

Abych pořád jen nekecal, pojďme si také ukázat nějaký ten kus kódu. Začněme obligátním Hello Worldíkem:

(display "Hello World!")

Scheme používá tzv. prefixovou notaci, což znamená, že funkce je napsána na první místo, teprve potom následují její argumenty. Na výše uvedeném příkladě to vypadá poměrně přirozeně, u aritmetiky by nás to však mohlo překvapit:

(+ 1 2 3 4 5)

Protože Scheme se doslova vyžívá v rekurzi, ukážeme si její použití na příkladě faktoriálu:

; factorial
(define (factorial n)
  (if (= n 1)
      1
      (* n (factorial (- n 1)))))

Závěr

Scheme, ačkoliv dnes není příliš rozšířené, je velmi zajímavý jazyk, který by rozhodně neměl upadnout v zapomnění. Myslím si také, že každý, kdo se opravdu zajímá o programování, by měl k funkcionálním jazykům alespoň přičichnout. Funkcionální jazyky naučí člověka uvažovat o psaní programů zase trochu jiným způsobem, což mu samozřejmě rozšíří jeho vývojářské obzory. Mě osobně Scheme zaujalo. Co na něj říkáte vy?

Odkazy

Anketa

Má Scheme i v dnešní době jiný než edukativní význam?

Našli jste v článku chybu?