(Lispex)sicp.io
3.11 · 내부 정의와 지역 프로시저 묶음

내부 이름은 서로 협력하는 하나의 지역 프로그램을 설명한다.

프로시저를 한 번 호출하면 여러 이름 붙은 도우미가 사는 비공개 환경을 만들 수 있습니다. 서로 재귀적으로 부르는 도우미도 지역 정의가 설치된 뒤 같은 호출 환경에서 이름을 찾습니다.

생각해 볼 질문

여러 지역 프로시저가 바깥 환경에 이름을 흘리지 않으면서 서로를 참조하려면 어떻게 해야 할까요?

  • 지역 정의와 전역 바인딩 구분하기
  • 호출 환경 하나에서 서로 재귀적인 도우미 따라가기
  • 클로저가 적용될 때 도우미 이름을 찾는 이유 설명하기
  • 모든 바인딩을 만든 뒤 대입하는 scan-out 모형 구성하기
  • 명시적인 unassigned 표시와 올바른 프로시저 값 구분하기

classify-parity를 호출할 때마다 even-step과 odd-step이 그 호출 안에서 만들어집니다. 두 클로저는 같은 호출 환경을 공유하므로 even-step은 odd-step을, odd-step은 even-step을 부를 수 있지만 어느 이름도 전역으로 노출되지 않습니다. 실제 호출은 두 지역 정의가 모두 처리된 뒤에 일어나며 classify-parity를 다시 호출하면 새로운 비공개 바인딩 묶음이 생깁니다.

두 번째 프로그램은 정의를 인용된 데이터로 다루고 동시적인 지역 범위를 설명하는 scan-out 모양을 만듭니다. 먼저 모든 이름을 명시적인 unassigned 표시로 바인딩하고, set!으로 각 프로시저 값을 설치한 뒤, 남은 본문을 평가하는 형태입니다. 이번 실행은 변환을 데이터로 만들 뿐 생성된 식을 실행하거나 모든 Scheme 구현이 같은 중간 표현을 노출한다고 주장하지 않습니다.

리스펙스 · SICP 코드SICP에 필요한 Scheme 호환 문법을 리스펙스 SICP 프로필로 실행합니다.
(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)))
리스펙스 학습용 런타임리스펙스 SICP 프로필 1.0.0
리스펙스 SICP 런타임 불러오는 중
리스펙스 · SICP 코드UTF-8 333 / 1,048,576바이트
예제
결과
출력
진단
보이는 실행 흐름0 / 0 개의 실행 이벤트
    이 브라우저 결과는 리스펙스 바우치나 권한이 아닙니다.wasm —
    예상 관찰

    첫 프로그램은 ((#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일 때 참을 반환합니다.