Закрытие представляет собой пару, состоящую из указателя кода и указателя окружения. Указатель окружения содержит все свободные переменные данной функции. Например:
fun f(a, b) =
let fun g(c, d) = a + b + c + d
in g end
val g = f(1, 2)
val result = g(3, 4) (*should be 10*)
Функция g
содержит две свободные переменные: a
и b
. Если вы не знакомы с термином «свободная переменная», это переменная, которая не определена в рамках функции. В этом контексте, до закрыть над что-то, значит удалить любые вхождения свободной переменной из функции. Приведенный выше пример обеспечивает хорошую мотивацию для закрытия. Когда возвращается функция f
, мы должны помнить, что значения для a
и b
предназначены для последующего использования. Как это компилируется, чтобы рассматривать функцию g
как указатель кода и запись, содержащую все свободные переменные, такие как:
fun g(c, d, env) = env.a + env.b + c + d
fun f(a, b, env) = (g, {a = a, b = b})
val (g, gEnv) = f(1, 2)
val result = g(3, 4, gEnv)
Когда мы применяем функцию g
, мы поставляем среды, который был возвращен при вызове функция f
. Обратите внимание, что теперь функция g
больше не имеет вхождений переменной, которая не определена в ее области. Обычно мы называем термин, который не имеет никаких свободных переменных, поскольку закрыт. Если вы до сих пор неясно, Могущество Matt имеет превосходную глубину объяснение преобразования закрытия в http://matt.might.net/articles/closure-conversion/
http://en.wikipedia.org/wiki/Closure_%28computer_programming%29#History_and_etymology - дает вам кое-что для начала. Закрытие «закрывает» открытые привязки. – Blorgbeard
LOL, * * Закрытие - это что-то, что закрывается над открытыми связями. * «Может ли это быть менее описательным?!? В самом деле?!? ** Действительно?!?! ** – smeeb
У вас будет точка, если бы это была прямая цитата из всего, что я сказал или связал.Вот что я связал с: «лямбда-выражение, открытые привязки (свободные переменные) были закрыты (или связаны) лексической средой, что привело к закрытому выражению или закрытию». – Blorgbeard