언제 필요한가요?
결과에 이름을 붙이거나 로컬 스코프를 만들거나 호출 사이의 상태를 의도적으로 보존할 때 바인딩을 사용합니다. 대부분은 define과 let이면 충분하며, 공유 변경이 모델의 일부일 때만 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이며 새 바인딩을 만들지 않습니다.
현재 경계
- 내부 미초기화 센티널은 게스트 값으로 표현할 수 없습니다.
다음으로
프로시저에서 클로저가 이 셀을 어떻게 캡처하는지 보고, 클로저 가이드에서 작은 상태 예제로 확인하세요.