프레임과 프로시저와 진리값과 인자 목록도 평가기의 데이터다.
평가기 제어를 연결하는 가변 프레임, 어휘 환경 체인, 태그가 있는 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과 인용한 기호는 참입니다. 이 레코드들은 프레임과 프로시저와 인자와 참 판정을 위한 수업용 평가기 규약을 이룹니다.
- 출력
- —
- 값
- —
- 진단
- —
환경 프로그램은 (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와 포획한 프로시저 환경 길이를 반환하세요.
힌트 보기
정의는 첫 프레임을 대상으로 하고 대입은 바깥으로 검색하며 처음 찾은 기존 레코드를 바꿉니다.