하나의 점화식은 변하는 객체나 불변 스트림으로 나타날 수 있다.
비공개 가변 seed와 다음 상태를 명시적인 지연 인자로 가진 스트림으로 같은 결정적 값을 만듭니다.
상태를 객체 안에 숨기는 대신 스트림으로 표현하면 어떤 의존 관계가 더 잘 드러날까요?
- 하나의 점화식을 상태가 있는 generator 객체로 구현하기
- 같은 점화식을 불변 지연 스트림으로 구현하기
- 같은 유한 관찰과 같은 프로세스 구조를 구분하기
- 객체는 변경으로 reset하고 스트림은 재구성으로 다시 시작하기
- 클라이언트가 필요한 인터페이스와 이력에 따라 모형 고르기
make-rand는 seed를 숨기고 generate 메시지마다 바꿉니다. random-stream은 현재 seed를 명시적으로 받고 next를 계산해 스트림에 놓은 뒤 그 next에서 이어지는 생성을 지연합니다. 둘은 같은 점화식을 사용하므로 seed 1에서 앞의 다섯 수가 같습니다.
reset 가능한 객체는 비공개 seed를 제자리에서 바꿉니다. 함수형 버전은 seed 1에서 새 스트림을 만들어 다시 시작하며 이전 스트림도 계속 남습니다. 같은 결과 리스트는 유한 앞부분의 일치를 확정합니다. 객체는 정체성과 명령을, 스트림은 재사용 가능한 이력과 명시적 데이터 흐름을 강조합니다.
- 출력
- —
- 값
- —
- 진단
- —
첫 프로그램은 (48271 182605794 1291394886 1914720637 2078669041) 수열을 두 번 반환한 뒤 #t를 반환합니다. reset 프로그램은 (48271 182605794 reset 48271 48271 182605794)를 반환합니다.
비공개 객체 seed의 set!을 따라가고 각 stream promise가 포획한 명시적 next 인자와 비교하세요. reset 실행에서는 한 객체 정체성을 바꾸는 것과 별도 스트림 이력을 만들고 유지하는 것을 구분하세요.
프로그램을 수정하고 결과를 비교해 보세요.
두 모형의 값을 even? 관찰의 유한 리스트나 스트림으로 바꾸세요. 함수형 스트림은 소비자 두 개로 갈라 사용하고 객체는 하나를 계속 진행한 뒤 어느 이력을 reset 없이 다시 재생할 수 있는지 설명하세요.
힌트 보기
메모이즈된 스트림 꼬리는 여러 소비자가 공유할 수 있습니다. 상태 객체는 프로토콜이 이력을 따로 저장하지 않으면 현재 위치 하나만 가집니다.