-
Lisp에서 클로저(closures)Programmer/Programming 2016. 2. 18. 15:57
클로저란 함수가 lexical 환경(environment)의 변수를 참조하는 것을 말한다. 1
예를 들면, 아래 코드를 살펴보자.
(defparameter *plus-10* (let ((x 10)) (lambda (y) (+ x y))))
X와 Y를 더하는 함수 객체를 만들고, *PLUS-10*이 이를 가르키게 한다.
Lexical 변수 X는 LET 구문 블럭이 생성한 환경에 갇혀서 외부에서는 접근할 수 없다.
LET 구문 블럭이 종료되었다는 것은 실행 흐름이 LET이 생성한 환경에서 벗어났다는 것을 의미한다.
그럼에도 불구하고, *PLUS-10*를 호출하면 X 변수를 참조할 수 있다.CL-USER> (funcall *plus-10* 20) 30
함수 객체가 다른 곳(예제에서는 dynamic 환경의 *PLUS-10*)에서 참조되고 있으면,
이 함수 객체가 속한 환경 역시 사라지지 않는다.
변수(예제에서는 X)를 만나면 자신이 속한 환경을 거슬러 올라가며 찾는다.함수의 호출 과정에서도 lexical 변수를 생성한다.
함수의 환경을 생성하고, 이 환경에 메인 함수의 인자를 생성하여, 전달받은 값을 참조하게 한다.이것을 응용하면 좀 더 재미있는 함수를 만들어볼 수 있다.
(defun plus-x (x) (lambda (y) (+ x y)))
PLUS-X 함수는 고정된 어떤 값을 더하는 함수를 자유자재로 만들 수 있다. 2
15를 더하는 함수를 다음과 같이 만들 수 있다.(defparameter *plus-15* (plus-x 15)
이와 같이 lexical 환경에서 정의된 함수가 lexical 변수를 참조하는 것을 클로저라고 한다.
2016/02/18 - [Practice/Lisp] - Lisp에서 lexical과 dynamic 변수 타입
- lexical이 무엇인지는 Lisp에서 lexical과 dynamic 변수 타입를 참고하라. [본문으로]
- curring과 비슷한 개념이라고 생각하면 되겠다. [본문으로]
'Programmer > Programming' 카테고리의 다른 글
버젼 관리 시스템을 사용하여 문제를 해결하기 (0) 2017.01.06 Common Lisp으로 구현한 트리(Tree)를 중위 순회(In-order Traversal)하는 반복자(Iterator) (0) 2016.05.17 Lisp에서 lexical과 dynamic 변수 타입 (0) 2016.02.18 Lisp 비교 : 암호 문자열 감추기 문제 풀이 (1) 2016.01.13 리습(Lisp)을 위한 SyntaxHighlighter 3.0 플러그인 작성 (0) 2015.03.17 댓글