Można ich użyć do sterowania przepływem. Na przykład w Smalltalk, metoda "ifTrue: ifFalse:" jest metodą dla obiektów Boolean, z inną implementacją dla każdej z klas True i False. Wyrażenie
someBoolean ifTrue: [self doSomething] ifFalse: [self doSomethingElse]
wykorzystuje dwa zamknięcia --- bloków, w [nawiasach kwadratowych] w Smalltalk składni --- jeden dla prawdziwego oddziału, a drugi dla fałszywego oddziału. Realizacja „ifTrue: ifFalse:” dla instancji klasy Prawdziwego jest
ifTrue: block1 ifFalse: block2
^block1 value
i dla klasy Fałsz:
ifTrue: block1 ifFalse: block2
^block2 value
Zamknięcia, tutaj są używane do opóźnienia oceny tak, że decyzja o kontroli przepływu może być wzięty, bez specjalnej składni w ogóle (oprócz składni bloków).
Haskell jest trochę inny, a jego leniwy model oceny skutecznie automatycznie generuje efekt zamknięcia w wielu przypadkach, ale na Schemacie często używasz lambdas do sterowania przepływem. Na przykład, tutaj to narzędzie do pobierania wartości od stowarzyszenia liście, dostarczając ewentualnie obliczonych domyślnie w przypadku, gdy wartość nie jest obecna:
(define (assq/default key lst default-thunk)
(cond
((null? lst) (default-thunk)) ;; actually invoke the default-value-producer
((eq? (caar lst) key) (car lst))
(else (assq/default key (cdr lst) default-thunk))))
To byłoby nazwać tak:
(assq/default 'mykey my-alist (lambda() (+ 3 4 5)))
Kluczem tutaj jest użycie lambda, aby opóźnić obliczenie wartości domyślnej, dopóki nie będzie to wymagane.
Zobacz także kontynuację-mijanie-stylu, który prowadzi to do skrajności. JavaScript, na przykład, opiera się na kontynuowaniu przekazywania stylu i zamknięciach, aby wykonać wszystkie operacje blokujące (takie jak sen, operacje wejścia/wyjścia itp.).
ETA: Gdzie mówiłem zamknięcia powyżej, to znaczy leksykalnie zawężona zamknięć. Często jest to zakres leksykalny.
zmieni się to do pracy? def zawiera (lst, pozycja): return lst (przedmiot) lub brak –