sicp.io
4.1.5 · 평가기 데이터 구조

프레임과 프로시저와 진리값과 인자 목록도 평가기의 데이터다.

평가기 제어를 연결하는 가변 프레임, 어휘 환경 체인, 태그가 있는 primitive·compound procedure, 진리 검사, 순서가 있는 인자 목록을 구성합니다.

생각해 볼 질문

프로시저를 나중에 생성 환경에서 적용하려면 평가기가 어떤 정보를 유지해야 할까요?

  • 프레임 하나를 비공개 표시 뒤의 변수·값 레코드로 표현하기
  • 가장 가까운 프레임부터 환경 체인 조회하기
  • compound procedure 레코드에 매개변수·본문·생성 환경 저장하기
  • 호스트 primitive 구현과 compound procedure를 별도 태그로 구분하기
  • guest 진리 술어에서 #f만 거짓으로 다루기
  • 인자 값 목록을 만들 때 피연산자 순서 보존하기

첫 프로그램은 x = 10인 전역 프레임과 x = 3, y = 4인 지역 프레임을 만듭니다. 조회는 전역 레코드를 바꾸지 않고 가장 가까운 x를 찾습니다. compound-procedure 레코드는 매개변수 z 하나와 본문 식 하나와 완전한 지역 환경 체인을 저장하여 나중 적용이 같은 어휘 문맥을 확장할 수 있게 합니다.

두 번째 프로그램은 호스트 + 프로시저를 primitive 데이터로 태그하고 구현을 꺼낸 뒤 적용합니다. list-of-values는 명시적인 probe로 왼쪽부터 인자 평가 순서를 기록합니다. guest true?는 #f를 거짓으로 보므로 0과 인용한 기호는 참입니다. 이 레코드들은 프레임과 프로시저와 인자와 참 판정을 위한 수업용 평가기 규약을 이룹니다.

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

    환경 프로그램은 (3 10 4 compound (z) 1 2)를 반환합니다. 프로토콜 프로그램은 (primitive + 12 (first second third) #f #t #t)를 반환합니다.

    실행 추적에서 볼 점

    지역 프레임을 먼저 보고 전역 프레임으로 이어지는 lookup을 따라간 뒤 compound 레코드에 저장된 환경을 살펴보세요. 두 번째 프로그램에서는 프로시저 태그와 적용을 나누고 observation 목록이 인자 순서를 그대로 따르는지 확인하세요.

    직접 해보기

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

    프레임 모형에 define-variable!과 set-variable-value!를 추가하세요. 지역 w를 정의하고 가장 가까운 x에 대입한 뒤 지역·전역 x와 포획한 프로시저 환경 길이를 반환하세요.

    힌트 보기

    정의는 첫 프레임을 대상으로 하고 대입은 바깥으로 검색하며 처음 찾은 기존 레코드를 바꿉니다.

    이 수업 완료하기

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