11.2. Proměnné a funkce

Nyní, když víte, že každý výrok ve Scheme je uzavřen v kulatých závorkách a že jméno funkce či operátor je v závorkách uveden na prvním místě, je třeba se naučit a vytvářet proměnné a funkce. Začneme proměnnými.

11.2.1. Deklarace proměnných

I když existuje více způsobů, jak promenné vytvářet, je preferována metoda pomocí konstrukce let*. Pokud znáte jiné programovací jazyky, je tato metoda ekvivalentní definici seznamu lokálních proměnných a rozsahu jejich platnosti. Jako příklad deklarujeme dvě proměnné, a a b, inicializované na hodnoty 1 a 2:

         (let*  (
                   (a 1)
                   (b 2)
                )
                (+ a b)
         )
      

nebo na jedné řádce:

        (let* ( (a 1) (b 2) ) (+ a b) )
      
[Poznámka] Poznámka

Používáte-li Script-Fu konzoli, je třeba zadat vše na jednom řádku. V ostatních případech je však dobré používat přehledné odsazování pro zvýšeni čitelnosti kódu. Více si o tom povíme v části věnované bílým znakům.

Takto jsou deklarovány dvě lokální proměnné, a a b, inicializovány a je vypsán jejich součet.

11.2.2. Co je lokální proměnná?

Jistě jste si všimli, že součet (+ a b) byl zapsán uvnitř závorek výrazu let*, nikoliv za nimi.

Je to tak, protože výrok let* definuje oblast skriptu, ve které jsou deklarované proměnné použitelné. Pokud by byl výraz (+ a b) až za výrazem (let* ...), vznikla by chyba, protože deklarované proměnné jsou platné pouze uvnitř výroku let*; jedná se o tzv. lokální proměnné.

11.2.3. Obecná syntaxe let*

Zápis výroku let* je obecně následující:

        (let* ( proměnné ) výrazy )
      

Proměnné jsou deklarovány v závorkách, např. (a 2), a výrazy jsou jakékoliv platné Scheme výrazy. Nezapomeňte, že takto deklarované proměnné jsou platné pouze uvnitř výroku let* – jsou to lokální proměnné.

11.2.4. Bílé znaky

Již dříve jsme poznamenali, že je dobré kód skriptů zpřehlednit použitím odsazování. Skutečně se to vyplatí. Ve Scheme není s odsazováním žádný problém; protože interpretr bílé znaky (tj. mezery, tabulátory, nové řádky a podobné) zcela ignoruje, je proto možné je pro formátování a zpřehlednění skriptu libovolně používat. Ve Script-Fu konzoli ale musíte psát vždy celý výraz na jeden řádek; vše mezi otevírací a uzavírací závorkou výrazu musí být ve Script-Fu konzoli na jednom řádku.

11.2.5. Přiřazení nové hodnoty proměnné

Často je třeba změnit hodnotu již inicializované proměnné. Ke změně hodnoty proměnné se používá výrok set!:

        (let* ( (theNum 10) ) (set! theNum (+ theNum \
        theNum)) )
      

Pokuste se odhadnout, co výše uvedený výrok dělá, a pak ho zadejte do Script-Fu konzole.

[Poznámka] Poznámka

Znak \ značí pouze, že na jeho místě není konec řádky. Nezadávejte ho do konzoly, netiskněte na jeho místě Enter, prostě pokračujte další řádkou.

11.2.6. Funkce

Nyní, když umíte pracovat s proměnnými, se podíváme na funkce. K deklaraci funkce slouží následující syntaxe:

        (define (jmeno
        seznam-parametru)
        vyrazy)
      

kde jmeno je jméno funkce, seznam-parametru je mezerami oddělený seznam jmen parametrů funkce a vyrazy je řada výrazů, které funkce při svém zavolání vykoná. Například:

        (define (AddXY inX inY) (+ inX inY) )
      

Tato funkce se jmenuje AddXY a má dva parametry, proměnné inX a inY. Funkce oba své parametry sečte.

Pokud jste programovali v jiných imperativních jazycích (např. v C/C++, Javě, Pascalu atd.), možná jste si všimli, že definice funkce neobsahuje ve srovnání s jinými jazyky řadu položek.

  • Parametry nemají žádné typy (nejsou deklarované jako řetězce, celá čísla apod.). Scheme je jazyk bez typové kontroly. To je velmi praktické a usnadňuje rychlé psaní skriptů.

  • Navíc se také ve Scheme nemusíme zabývat vracením výsledku funkce, vrácenou hodnotou při zavolání funkce je poslední výrok. Zadejte výše uvedenou funkci do Script-Fu konzole a pak zkuste následující:

                (AddXY (AddXY 5 6) 4)