sicp.io
3.2.1 · 평가의 환경 모델

평가는 식을 따라가고 조회는 프레임 연결을 따라간다.

수업용 어휘 평가기와 명시적인 프레임 연산을 실행하여 자기 평가와 이름 조회와 프로시저 생성·적용과 정의와 대입을 한 모형에 놓습니다.

생각해 볼 질문

식이 프로시저를 만들 때와 그 프로시저를 나중에 적용할 때 각각 어느 환경을 사용할까요?

  • 환경을 순서가 있는 프레임 리스트로 표현하기
  • 이름 조회에서 가장 가까운 프레임부터 찾기
  • 복합 프로시저 안에 생성 환경 포획하기
  • 적용할 때 포획한 환경에 새 매개변수 프레임 연결하기
  • 첫 프레임의 정의와 기존 바인딩의 대입 구분하기

model-eval은 자기 평가 값과 변수와 quote와 lambda와 적용을 처리합니다. lambda를 평가하면 매개변수와 본문과 현재 환경을 담은 compound-procedure 데이터를 만듭니다. 그 값을 적용하면 포획한 환경에 새 매개변수 프레임을 연결하여 본문을 평가하므로 안쪽 y 호출은 바깥 x를 계속 찾을 수 있습니다.

두 번째 프로그램은 프레임 변경을 직접 드러냅니다. 조회는 전역 x보다 지역 x를 먼저 찾습니다. set-variable-value!는 이미 있는 지역 레코드를 바꾸고 define-variable!은 첫 프레임에 y를 더합니다. 어느 연산도 전역 x를 바꾸지 않습니다. 이 설명용 평가기는 나열한 형식의 환경 규칙을 직접 모델링합니다.

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

    수업용 평가기는 (7 13)을 반환합니다. 프레임 변경 프로그램은 (3 4 7 10)을 반환합니다.

    실행 추적에서 볼 점

    평가기에서는 lambda 평가와 프로시저 적용을 나누고 각 compound 값이 포획한 부모 환경을 따라가세요. 프레임 프로그램에서는 가장 가까운 assoc 성공, 지역 x를 바꾸는 set-cdr!, 첫 프레임에 y를 더하는 set-car!를 찾으세요.

    직접 해보기

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

    model-eval에 if를 추가하고 지역 매개변수와 포획한 바깥 값 중 하나를 고르는 클로저를 평가하세요. 전역 y도 정의한 뒤 지역 정의가 전역을 바꾸지 않고 가리는지 확인하세요.

    힌트 보기

    선택한 if 갈래만 평가하세요. define은 주어진 환경의 첫 프레임을 대상으로 합니다.

    이 수업 완료하기

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