Поиск…


Вступление

Из тега закрытия StackOverflow:

Закрытие - это первоклассная функция, которая ссылается на (закрывает) переменные из области, в которой она была определена. Если закрытие все еще существует после того, как его определяющая область действия заканчивается, переменные, которые она закрывает, будут продолжать существовать.

замечания

Иногда полезно рассматривать закрытие и объекты как похожие.

Почтенный мастер Qc Na шел со своим учеником Антоном. Надеясь пригласить мастера на обсуждение, Антон сказал: «Учитель, я слышал, что объекты - очень хорошая вещь - это правда?» Qc Na с жалостью посмотрел на своего ученика и ответил: «Глупый ученик - объекты - просто закрытие бедных». Обвинившись, Антон ушел от своего хозяина и вернулся в свою камеру, намеренно изучая закрытие. Он внимательно прочитал целую серию статей «Лямбда: The Ultimate ...» и ее двоюродных братьев и реализовал небольшой интерпретатор Scheme с объектной системой, основанной на закрытии. Он многому научился и с нетерпением ожидал сообщить хозяину о своем прогрессе.

На следующей прогулке с Qc Na Антон попытался произвести впечатление на своего хозяина, сказав: «Учитель, я усердно изучил этот вопрос и теперь понимаю, что объекты действительно закрыты для бедных». Qc Na ответил, ударив Антона своей палкой, сказав: «Когда вы узнаете, что закрытие - объект бедного человека». В этот момент Антон стал просветленным.

Источник: http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent

Закрытие со статической средой

Закрытие - это процедура, которая содержит внутреннее состояние:

Определить процедуру, которая возвращает замыкание

Процедура make-an-adder принимает один аргумент x и возвращает функцию, которая закрывается над значением. Или, говоря иначе, x находится в лексической области возвращаемой функции.

#lang racket
(define (make-an-adder x)
  (lambda (y)
    (+ y x)))

использование

Вызов процедуры make-an-adder возвращает процедуру, которая является закрытием.

Welcome to DrRacket, version 6.6 [3m].
Language: racket, with debugging; memory limit: 128 MB.
> (define 3adder (make-an-adder 3))
> (3adder 4)
7
> (define 8adder (make-an-adder 8))
> (8adder 4)
12


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow