Hodnoty mohou být čísla nebo jiný typ dat, například písmena, nebo datové struktury složené z jednodušších částí. V pravidlech programovacího jazyka jsou hodnotami první třídy hodnoty, které lze zadávat funkcím, vracet funkcemi a vázat na jméno proměnné. Funkce, které přijímají nebo vracejí jiné funkce, se nazývají funkce vyššího řádu. Většina jazyků, které mají funkce jako hodnoty první třídy, má také funkce vyššího řádu a uzávěry.
Podívejte se například na následující funkci Scheme:
; Vraťte seznam všech knih, u kterých se prodalo alespoň TISÍC výtisků. (define (best-selling-books threshold) (filter (lambda (book) (>= (book-sales book) threshold)) book-list)))
V tomto příkladu je lambda výraz (lambda (book) (>= (book-sales book) threshold)) součástí funkce best-selling-books. Při spuštění funkce musí Scheme vytvořit hodnotu lambdy. Udělá to tak, že vytvoří uzávěr s kódem lambdy a odkazem na proměnnou threshold, která je uvnitř lambdy volnou proměnnou. (Volná proměnná je jméno, které není vázáno na hodnotu.)
Funkce filtru pak provede uzávěrku na každé knize v seznamu a vybere, které knihy vrátí. Protože samotný uzávěr má odkaz na hodnotu threshold, může uzávěr tuto hodnotu použít při každém spuštění funkce filter. Samotná funkce filtr může být zapsána ve zcela samostatném souboru.
Zde je stejný příklad přepsaný v ECMAScriptu (JavaScript), dalším populárním jazyce s podporou uzávěrů:
// Vrátí seznam všech knih, u kterých se prodalo alespoň 'threshold' výtisků. function bestSellingBooks(threshold) { return bookList. filter( function(book) { return book. sales >= threshold; } ); }
ECMAScript zde používá slovo function místo lambda a metodu Array.filter místo funkce filter, ale jinak kód provádí stejnou věc stejným způsobem.
Funkce může vytvořit uzávěr a vrátit jej. Následující příklad je funkce, která vrací funkci.
Ve schématu:
; Vraťte funkci, která aproximuje derivaci f ; pomocí intervalu dx, který by měl být přiměřeně malý. (define (derivative f dx) (lambda (x) (/ (- (f (+ x dx))) (f x)) dx))))
V ECMAScriptu:
// Vraťte funkci, která aproximuje derivaci f // pomocí intervalu dx, který by měl být přiměřeně malý. funkce derivative(f, dx) { return function(x) { return (f(x + dx) - f(x))) / dx; }; }; }
Prostředí uzávěru zachovává vázané proměnné f a dx i po návratu uzavírající funkce (derivace). V jazycích bez uzávěrů by se tyto hodnoty po návratu uzavírající funkce ztratily. V jazycích s uzávěry musí být vázaná proměnná uchovávána v paměti tak dlouho, dokud ji má nějaká uzávěra.
Uzávěr nemusí být vytvořen pomocí anonymní funkce. Například programovací jazyk Python má omezenou podporu anonymních funkcí, ale má uzávěry. Jedním ze způsobů, jak lze výše uvedený příklad ECMAScriptu implementovat v jazyce Python, je například:
# Vraťte funkci, která aproximuje derivaci f # pomocí intervalu dx, který by měl být přiměřeně malý. def derivative(f, dx): def gradient(x): return (f(x + dx) - f(x)) / dx return gradient
V tomto příkladu tvoří funkce s názvem gradient uzávěr spolu s proměnnými f a dx. Vnější obklopující funkce s názvem derivace tuto uzávěrku vrací. V tomto případě by fungovala i anonymní funkce.
def derivative(f, dx): return lambda x: (f(x + dx) - f(x)) / dx
Python musí často používat pojmenované funkce, protože jeho lambda výrazy mohou obsahovat pouze jiné výrazy (kód, který vrací hodnotu), nikoli příkazy (kód, který má účinky, ale nemá hodnotu). V jiných jazycích, například ve Scheme, však veškerý kód vrací hodnotu; ve Scheme je vše výrazem.