closure 정의 (SICP 127쪽) 학술

닫힘 (closure)은 대수학에서 쓰는 말로, 어떤 집합에 속하는 원소를 가지고 연산한 결과가 그 집합에 속하면, 그 집합은 주어진 연산에 닫혀 있다는 뜻이다. 한데, 안타깝게도 Lisp를 쓰는 사람들은 closure라는 말을, 완전히 다른 뜻을 나타내는 데에도 쓴다. 곧 closure라고 하면 자유 변수를 가진 프로시저를 나타내는 기법을 말한다.

그동안 딱히 lisp의 closure가 뭐냐고 묻는 사람들에게 명쾌하게 정의를 설명해주지 못하고 어버버했다.
아래 인용구도 기억해둘만하다.

물체를 엮는 수단이 닫힘 성질을 만족해야 한다는 개념은 쉽게 받아들일 수 있는 생각이다. 한데, 여러 인기 있는 프로그래밍 언어에서 데이터를 엮는 연산은 닫힘 성질을 만족하지 않거나, 그런 닫힘 성질을 갖춰 쓰기가 까다롭다. 포트란이나 베이직에서는 흔히 배열에 여러 데이터를 집어넣어서 묶는데, 배열을 배열의 원소로 쓰지 못한다. 파스칼이나 C에서는 구조체가 다시 구조체의 원소가 될 수 있다. 하지만 그렇게 하려면 포인터를 곧바로 쓸 수 밖에 없고, 게다가 미리 정의된 구조체만 다른 구조체의 필드로 쓸 수 있다는 제약을 따라야 한다. 쌍을 가지고 있는 Lisp와는 달리,이런 언어는 똑같은 방법으로 합친 데이터를 쉽게 만들 수 있도록 하는 결합 수단을 갖추지 않았다. 이 책 머리말에서, Alan Perlis도 다음과 같은 말을 한 적이 있다. "파스칼에서는 선언할 수 있는 데이터 구조가 너무 많고, 또 그런 데이터 구조가 한 가지 방법으로 만들어지는 것이 아니라서, 함수 안에서 한 경우에만 쓸 수 있는 데이터 구조가 나온다. 그래서 그런 데이터를 서로 연동하여 쓰지 못하거나 연동하기 어렵다. 10가지 데이터 구조를 위한 10개의 함수보다는 1가지 데이터 구조를 위한 100개의 함수가 더 쓸만하다."

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://www.xeraph.com/tb/4024882 [도움말]

덧글

댓글 입력 영역