Szukaj…


Wprowadzenie

Z tagu zamknięcia StackOverflow:

Zamknięcie jest funkcją pierwszej klasy, która odwołuje się do (zamyka) zmiennych z zakresu, w którym została zdefiniowana. Jeśli zamknięcie nadal istnieje po zakończeniu jego definiującego zakresu, zmienne, które zamyka, również będą istnieć.

Uwagi

Czasami przydatne jest uznanie zamknięć i obiektów za podobne.

Czcigodny mistrz Qc Na szedł ze swoim uczniem Antonem. Mając nadzieję na poprowadzenie mistrza do dyskusji, Anton powiedział: „Mistrzu, słyszałem, że przedmioty są bardzo dobre - czy to prawda?” Qc Na spojrzał z politowaniem na swojego ucznia i odpowiedział: „Głupi uczeń - przedmioty są jedynie zamknięciem biednego człowieka”. Skazany na karę Anton odszedł od swego mistrza i wrócił do celi, zamierzając studiować zamknięcia. Uważnie przeczytał całą serię artykułów „Lambda: The Ultimate ...” i jej kuzynów, i zaimplementował mały interpreter Scheme z systemem obiektowym opartym na zamknięciu. Nauczył się wiele i z niecierpliwością czekał na poinformowanie swojego mistrza o swoich postępach.

Na następnym spacerze z Qc Na Anton próbował zaimponować swojemu panu, mówiąc: „Mistrzu, pilnie przestudiowałem tę sprawę i teraz rozumiem, że przedmioty są naprawdę zamknięciem biednego człowieka”. Qc Na odpowiedział uderzeniem kijem Antona, mówiąc: „Kiedy się nauczysz? Zamknięcia są przedmiotem biednego człowieka”. W tym momencie Anton został oświecony.

Źródło: http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent

Zamknięcie w środowisku statycznym

Zamknięcie to procedura obejmująca stan wewnętrzny:

Zdefiniuj procedurę zwracającą zamknięcie

Procedura make-an-adder pobiera jeden argument x i zwraca funkcję, która zamyka wartość. Innymi słowy, x znajduje się w zakresie leksykalnym zwracanej funkcji.

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

Stosowanie

Wywołanie procedury make-an-adder zwraca procedurę, która jest zakończeniem.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow