racket
Domknięcia
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