바인딩, 스코프, 셀, 변경

모든 어휘 바인딩은 변경 가능한 셀입니다. 클로저는 프레임을 캡처하므로 같은 셀의 이후 `set!` 갱신을 공유합니다.

언제 필요한가요?

결과에 이름을 붙이거나 로컬 스코프를 만들거나 호출 사이의 상태를 의도적으로 보존할 때 바인딩을 사용합니다. 대부분은 definelet이면 충분하며, 공유 변경이 모델의 일부일 때만 set!을 선택하세요.

실행으로 확인하기

LISPEX
(define x 1)
(define get (lambda () x))
(set! x 2)
(get)

관측 결과

OUTPUT
2

예제 읽기

get은 숫자 1의 얼어붙은 복사본이 아니라 x라는 전역 셀을 닫아 둡니다. set!이 같은 셀에 2를 쓰므로 나중 호출은 2를 봅니다. 안쪽에 새 x를 만들었다면 기존 셀을 바꾸지 않고 가립니다.

이 순서로 생각하세요

  • 조회는 가장 가까운 어휘 셀을 택하며 섀도잉은 바깥 바인딩을 변경하지 않습니다.
  • letrec은 초기식 전에 셀을 할당하고 초기화되지 않은 셀을 읽으면 E321을 냅니다.
  • 최상위 중복 define은 기존 전역 셀을 갱신하여 이전 클로저 참조를 보존합니다.

빠르게 고르기

형식쓸 때초기식이 보는 범위
define최상위 이름이나 이름 있는 프로시저현재 최상위 환경
let서로 독립인 로컬 값바깥 환경
let*앞선 로컬에 의존하는 로컬앞서 만든 각 바인딩
letrec서로 재귀하는 로컬 프로시저먼저 할당된 모든 셀; 이른 읽기는 실패
set!기존 셀 갱신새 바인딩을 만들지 않음

흔한 오해

바인딩되지 않은 이름의 set!은 E303이며 새 바인딩을 만들지 않습니다.

현재 경계

  • 내부 미초기화 센티널은 게스트 값으로 표현할 수 없습니다.

다음으로

프로시저에서 클로저가 이 셀을 어떻게 캡처하는지 보고, 클로저 가이드에서 작은 상태 예제로 확인하세요.

프로시저 · 클로저 가이드