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.
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 | |
---|---|
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.
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é.
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é.
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.
Č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 | |
---|---|
Znak |
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)