3.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.

3.2.1. Deklarace proměnných

I když existuje více způsobů, jak proměnné 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.

3.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é.

3.2.3. Obecná syntaxe let*

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

        (let* ( variables )
          expressions )
      

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é.

3.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.

3.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.

3.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
           (
              name
              param-list
           )
           expressions
        )
      

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)