Neprogramátor/Uzávěry a anonymní funkce

Uzávěr (anglicky closure) je, když si funkce pamatuje a použije informaci dostupnou při definici funkce, která není argument funkce. Anonymní (často lambda) funkce je funkce, která nemá jméno.

Uzávěry čaroděj použije, třeba když potřebuje vytvářet přičítače – kouzelné věty, které k číslu přičtou nějaké další číslo.

(přičti-1 5)

6

(přičti-4 5)

9

Čaroděj by mohl kouzelnou hůlku naučit každý přičítač zvlášť. Jenomže jeden z důvodů, proč toho čarodějové tolik zvládnou je, že jsou vážně líní. přičti-1 a přičti-4 by čaroděj mohl kouzelnou hůlku naučit pomocí vět

(define (přičti-1 k-čemu)
  (+ 1 k-čemu))
(define (přičti-4 k-čemu)
  (+ 4 k-čemu))

ale co když potřebuje 20 přičítačů? Nebo 200? Čaroděj vytvoří kouzelnou větu

(define (vytvoř-přičítač číslo)
  (define (přičítač k-čemu)
    (+ číslo k-čemu))
  přičítač)

a kouzelnou hůlku pak přičítače učí kouzelnými větami

(define přičti-1 (vytvoř-přičítač 1))
(define přičti-4 (vytvoř-přičítač 4))

vytvoř-přičítač je funkce vyššího řádu, protože výsledek vykonání této funkce je funkce přičítač. přičítač je uzávěr, protože si pamatuje hodnotu proměnné číslo, ale číslo není argumentem funkce přičítač. Jediným argumentem funkce přičítač je k-čemu.

Je potřeba zdůraznit, že čarodějové jsou opravdu líní a dost z nich si na tom zakládá. Proto řadě čarodějů přijde doslova zbytečné definovat nové kouzelné sloveso přičítač jen proto, aby jej vzápětí použili jako návratovou hodnotu funkce. Takoví čarodějové naučí kouzelnou hůlku kouzelné sloveso vytvoř-přičítač kouzelnou větou

(define (vytvoř-přičítač číslo)
  (lambda (k-čemu)
    (+ číslo k-čemu)))

lambda je kouzelné sloveso, které vytvoří funkci. Takže výsledek vykonání kouzelné věty začínající kouzelným slovesem lambda je kouzelné sloveso. Je to tak, že kouzelná věta

(define (přičti-1 k-čemu)
  (+ 1 k-čemu))

by se pomocí kouzelného slovesa lambda dala napsat jako

(define přičti-1 (lambda (k-čemu)
  (+ 1 k-čemu)))

V případě přičti-1 je kód složitější. V případě vytvoř-přičítač vypadá jednodušeji. A o tom to je.

◄ Funkce vyššího řádu Uzávěry a anonymní funkce