sicp.io
3.5.4 · 함수형 프로그램과 객체의 모듈성

하나의 점화식은 변하는 객체나 불변 스트림으로 나타날 수 있다.

비공개 가변 seed와 다음 상태를 명시적인 지연 인자로 가진 스트림으로 같은 결정적 값을 만듭니다.

생각해 볼 질문

상태를 객체 안에 숨기는 대신 스트림으로 표현하면 어떤 의존 관계가 더 잘 드러날까요?

  • 하나의 점화식을 상태가 있는 generator 객체로 구현하기
  • 같은 점화식을 불변 지연 스트림으로 구현하기
  • 같은 유한 관찰과 같은 프로세스 구조를 구분하기
  • 객체는 변경으로 reset하고 스트림은 재구성으로 다시 시작하기
  • 클라이언트가 필요한 인터페이스와 이력에 따라 모형 고르기

make-rand는 seed를 숨기고 generate 메시지마다 바꿉니다. random-stream은 현재 seed를 명시적으로 받고 next를 계산해 스트림에 놓은 뒤 그 next에서 이어지는 생성을 지연합니다. 둘은 같은 점화식을 사용하므로 seed 1에서 앞의 다섯 수가 같습니다.

reset 가능한 객체는 비공개 seed를 제자리에서 바꿉니다. 함수형 버전은 seed 1에서 새 스트림을 만들어 다시 시작하며 이전 스트림도 계속 남습니다. 같은 결과 리스트는 유한 앞부분의 일치를 확정합니다. 객체는 정체성과 명령을, 스트림은 재사용 가능한 이력과 명시적 데이터 흐름을 강조합니다.

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

    첫 프로그램은 (48271 182605794 1291394886 1914720637 2078669041) 수열을 두 번 반환한 뒤 #t를 반환합니다. reset 프로그램은 (48271 182605794 reset 48271 48271 182605794)를 반환합니다.

    실행 추적에서 볼 점

    비공개 객체 seed의 set!을 따라가고 각 stream promise가 포획한 명시적 next 인자와 비교하세요. reset 실행에서는 한 객체 정체성을 바꾸는 것과 별도 스트림 이력을 만들고 유지하는 것을 구분하세요.

    직접 해보기

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

    두 모형의 값을 even? 관찰의 유한 리스트나 스트림으로 바꾸세요. 함수형 스트림은 소비자 두 개로 갈라 사용하고 객체는 하나를 계속 진행한 뒤 어느 이력을 reset 없이 다시 재생할 수 있는지 설명하세요.

    힌트 보기

    메모이즈된 스트림 꼬리는 여러 소비자가 공유할 수 있습니다. 상태 객체는 프로토콜이 이력을 따로 저장하지 않으면 현재 위치 하나만 가집니다.

    이 수업 완료하기

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