수색…
소개
StackOverflow 클로저 태그에서 :
클로저는 변수가 정의 된 범위에서 변수를 참조하는 최상위 함수입니다. 정의 범위가 끝난 후 클로저가 여전히 존재하면 닫히는 변수도 계속 존재합니다.
비고
클로저와 오브젝트를 유사한 것으로 간주하는 것이 유용 할 때도 있습니다.
존경스런 선생님은 그의 학생 Anton와 함께 걷고있었습니다. 마스터에게 토론을 촉구하기를 바란다. Anton는 "스승님, 물건이 아주 좋은 것이라고 들었다. 사실인가?" Qc Na는 그의 학생을 불쌍하게 바라보며 "어리석은 학생들 - 물건은 가난한 사람의 닫음에 불과합니다."라고 대답했습니다. Chastised, Anton는 그의 주인에게서 그의 휴가를 가지고 가고 폐쇄를 공부하기에 그의 세포로 돌려 보냈다. 그는 신중하게 "Lambda : Ultimate ..."시리즈의 논문과 그 사촌을 읽고 클로저 기반 객체 시스템으로 작은 Scheme 인터프리터를 구현했습니다. 그는 많은 것을 배웠고 그의 주인에게 그의 진보를 알리기를 고대했다.
다음 번에 Qc Na와 함께 걸어 가면서 안톤은 "스승님, 나는 그 문제를 부지런히 연구했으며, 지금은 사물들이 진정으로 가난한 사람의 종결이라는 것을 이해한다"고 말하면서 그의 주인을 감동 시키려고했다. Qc Na는 그의 막대기로 안톤을 때리고 "언제 배울 것인가? 클로저는 가난한 사람의 물건이다"라고 대답했다. 그 순간에 안톤은 깨달음을 얻었습니다.
정적 환경으로 폐쇄
클로저는 내부 상태를 유지하는 프로 시저입니다.
클로저를 반환하는 프로 시저를 정의합니다.
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