Вы можете использовать их для управления потоком. Например, в Smalltalk метод ifTrue: ifFalse: является методом для логических объектов с другой реализацией в каждом из классов True и False. Выражение
someBoolean ifTrue: [self doSomething] ifFalse: [self doSomethingElse]
использует два затворы --- блоков, в [квадратных скобках] в Smalltalk синтаксис --- один для истинной ветви, и один для ложной ветви. Реализация «ifTrue: ifFalse:» для экземпляров класса ИСТИНА
ifTrue: block1 ifFalse: block2
^block1 value
и для класса Ложный:
ifTrue: block1 ifFalse: block2
^block2 value
Затворы, здесь, используются для задержки оценки, с тем, что решение о потоке управления может быть принято, без какого-либо специализированного синтаксиса вообще (кроме синтаксиса для блоков).
Haskell немного отличается, его ленивая модель оценки эффективно автоматически производит эффект закрытия во многих случаях, но на Схеме вы в конечном итоге используете lambdas для управления потоком. Например, здесь это утилита для извлечения значения из ассоциации-списка, снабжая необязательно-вычисленный по умолчанию в случае, когда значение нет:
(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))))
Это будет называться так:
(assq/default 'mykey my-alist (lambda() (+ 3 4 5)))
Ключом здесь является использование лямбда для задержки вычисления значения по умолчанию, пока не станет известно, что это требуется.
См. Также продолжение-прохождение-стиль, который делает это до крайности. Например, Javascript полагается на продолжение и стиль закрытия, чтобы выполнять все свои блокирующие операции (такие как спящий режим, ввод-вывод и т. Д.).
ETA: Где я сказал закрытие выше, я имею в виду лексической область видимости закрытия. Часто это лексический масштаб.
изменит его работу? def содержит (lst, item): return lst (item) or None –