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 |