sicp.io
1.1.2 · 이름과 환경

이름은 특정 환경에서 자기 값을 얻는다.

정의는 나중 식이 조회할 수 있는 바인딩을 만듭니다. 프로시저 호출과 let 식은 지역 바인딩을 더하므로 같은 기호가 바깥 환경을 바꾸지 않고 다른 값을 나타낼 수 있습니다.

생각해 볼 질문

전역 정의와 매개변수와 지역 이름이 함께 있을 때 평가기는 한 이름이 어떤 값을 뜻하는지 어떻게 결정할까요?

  • define을 소스의 기호 치환이 아니라 바인딩 생성으로 읽기
  • 앞에서 정의한 이름을 뒤의 식이 조회하는 과정 따라가기
  • 전역 환경과 프로시저 호출 환경 구분하기
  • 바깥 이름을 가리는 매개변수 알아보기
  • let의 지역 이름이 바깥 환경으로 새지 않게 이해하기

정의는 현재 환경에서 이름과 값을 연결합니다. rectangle-area는 (* width height)를 글자로 치환한 별명이 아닙니다. 정의가 실행될 때 계산한 값을 가진 별도의 바인딩입니다. 뒤의 list 식은 같은 환경에서 width와 height와 rectangle-area와 perimeter를 이름으로 조회합니다.

describe를 호출하면 바깥 환경에 x = 10이 있어도 매개변수 x = 3을 가진 새 환경이 생깁니다. 안쪽 let은 그 호출 환경에 y를 더합니다. 본문의 조회는 가장 가까운 같은 이름의 바인딩을 먼저 찾으므로 호출 안에서는 x가 3이고 호출 전후 바깥에서는 10입니다. 지역 y는 호출이 끝나면 더 이상 보이지 않습니다.

SICP 코드UTF-8 187 / 1,048,576바이트
예제
결과
출력
진단
실행 추적0 / 0 개 이벤트
    실행은 브라우저 안에서 이루어지며 프로그램 결과와 실행 추적을 보여줍니다.
    예상 결과

    정의 프로그램은 (3 4 12 14)를 반환합니다. 이름 가리기 프로그램은 ((global-x 10) (parameter-x 3 local-y 4 sum 7) (global-after 10))을 반환합니다.

    실행 추적에서 볼 점

    첫 실행에서는 각 정의 값을 계산하는 평가와 나중에 저장된 값을 가져오는 기호 조회를 나누어 보세요. 두 번째 실행에서는 describe를 위한 환경과 매개변수 x = 3과 let이 더한 y = 4를 찾으세요. 이 조회를 호출 전후의 전역 x = 10과 비교하세요. 실행 흐름은 선택한 프로그램의 환경 이력과 수업용 프레임 레이블을 정확히 기록합니다.

    직접 해보기

    프로그램을 수정하고 결과를 비교해 보세요.

    전역 y를 100으로 추가하고 지역 let 바인딩 이름은 계속 y로 두세요. describe 안쪽 결과와 호출 뒤 전역 y를 함께 반환하고 각 y 참조가 어느 바인딩을 조회하는지 예상하세요.

    힌트 보기

    프로시저 본문이 실행되는 동안에는 지역 y가 더 가깝습니다. 호출이 끝난 뒤에는 전역 y만 다시 보입니다.

    이 수업 완료하기

    이 장의 총 18개 수업 중 0개 완료0%