내부 이름은 서로 협력하는 하나의 지역 프로그램을 설명한다.
프로시저를 한 번 호출하면 여러 이름 붙은 도우미가 사는 비공개 환경을 만들 수 있습니다. 서로 재귀적으로 부르는 도우미도 지역 정의가 설치된 뒤 같은 호출 환경에서 이름을 찾습니다.
여러 지역 프로시저가 바깥 환경에 이름을 흘리지 않으면서 서로를 참조하려면 어떻게 해야 할까요?
- 지역 정의와 전역 바인딩 구분하기
- 호출 환경 하나에서 서로 재귀적인 도우미 따라가기
- 클로저가 적용될 때 도우미 이름을 찾는 이유 설명하기
- 모든 바인딩을 만든 뒤 대입하는 scan-out 모형 구성하기
- 명시적인 unassigned 표시와 올바른 프로시저 값 구분하기
classify-parity를 호출할 때마다 even-step과 odd-step이 그 호출 안에서 만들어집니다. 두 클로저는 같은 호출 환경을 공유하므로 even-step은 odd-step을, odd-step은 even-step을 부를 수 있지만 어느 이름도 전역으로 노출되지 않습니다. 실제 호출은 두 지역 정의가 모두 처리된 뒤에 일어나며 classify-parity를 다시 호출하면 새로운 비공개 바인딩 묶음이 생깁니다.
두 번째 프로그램은 정의를 인용된 데이터로 다루고 동시적인 지역 범위를 설명하는 scan-out 모양을 만듭니다. 먼저 모든 이름을 명시적인 unassigned 표시로 바인딩하고, set!으로 각 프로시저 값을 설치한 뒤, 남은 본문을 평가하는 형태입니다. 이번 실행은 변환을 데이터로 만들 뿐 생성된 식을 실행하거나 모든 Scheme 구현이 같은 중간 표현을 노출한다고 주장하지 않습니다.
(begin
(define (classify-parity n)
(define (even-step value)
(if (= value 0)
#t
(odd-step (- value 1))))
(define (odd-step value)
(if (= value 0)
#f
(even-step (- value 1))))
(list (even-step n) (odd-step n)))
(list (classify-parity 7)
(classify-parity 8)))- 출력
- —
- 값
- —
- 진단
- —
첫 프로그램은 ((#f #t) (#t #f))를 반환합니다. 두 번째 프로그램은 even-step과 odd-step을 인용된 *unassigned* 표시에 바인딩한 let 식과 두 set! 형식, 원래 본문을 반환합니다.
첫 실행에서는 classify-parity가 만든 환경을 찾고 전역 even-step이나 odd-step 조회 없이 번갈아 적용되는 호출을 따라가세요. 두 번째 실행에서는 인용된 정의를 읽는 일과 바인딩, lambda 값, 대입, 최종 본문을 만드는 일을 구분하세요. 생성된 형식은 이 유한한 입력의 설명 모형이며 런타임 내부 컴파일 단계의 실행 흐름은 아닙니다.
힌트를 보기 전에 프로그램을 바꿔 보세요.
세 개의 서로 재귀적인 프로시저로 나머지 0, 1, 2 상태를 순환하는 지역 divisible-by-three? 도우미 묶음을 만드세요. 공개 분류 프로시저 하나 안에 이름을 숨기고 8과 9의 결과를 예상하세요.
힌트 하나 보기
각 도우미는 나머지 한 종류를 나타내고 1을 뺀 뒤 다음 도우미를 부릅니다. 나머지 0 도우미만 값이 0일 때 참을 반환합니다.