각 클로저는 자기만의 저장 위치를 가질 수 있다.
같은 생성자가 만든 두 프로시저도 같은 코드를 실행하면서 서로 다른 바인딩을 기억할 수 있습니다.
생각해 볼 질문
같은 프로시저가 만든 두 카운터가 서로의 값을 덮어쓰지 않는 이유는 무엇일까요?
- 클로저를 그것이 만들어진 환경과 연결하기
- 동일한 프로시저 코드와 서로 다른 저장 위치 구분하기
- 공유 바인딩과 비공개 바인딩에서 나오는 관찰 결과 예측하기
make-counter를 호출할 때마다 새로운 value 바인딩이 만들어지고 그 바인딩에 대한 접근을 유지하는 프로시저가 반환됩니다. left와 right는 lambda 식을 공유하지만 그 바인딩은 공유하지 않습니다.
두 번째 예제는 value를 두 프로시저 바깥으로 옮깁니다. 그러면 그 단일 위치가 공유되므로 어느 한 프로시저를 통한 갱신이 다른 프로시저의 시작점이 됩니다.
SICP 코드UTF-8 246 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
실행 추적0 / 0 개 이벤트
첫 프로그램은 (1 2 11 3 12)를 반환합니다.
두 make-counter 적용을 나중의 left 및 right 호출과 비교하세요. 반복되는 lambda 본문은 자신이 생성된 환경이 포획한 위치에 도달합니다.
프로그램을 수정하고 결과를 비교해 보세요.
100에서 시작하는 세 번째 카운터를 만드세요. 세 카운터의 호출을 엇갈리게 배치하고 어느 호출이 서로에게 영향을 줄 수 있는지 예측하세요.
힌트 보기
make-counter의 호출 횟수를 세어 보세요. 각 호출은 새로운 비공개 value 바인딩을 하나씩 만듭니다.