agenda는 시뮬레이션 시간을 명시적인 데이터로 만든다.
시간표가 붙은 동작을 정렬된 agenda에 넣으면 등록 순서와 달라도 가장 이른 시뮬레이션 시간부터 처리할 수 있습니다.
생각해 볼 질문
시뮬레이션은 등록된 순서를 따르지 않고 다음 사건을 어떻게 고를까요?
- 사건을 명시적인 시간과 동작 데이터로 표현하기
- 타임스탬프의 비감소 순서로 사건 삽입하기
- 동일한 시간의 사건들 사이에서 스케줄링 순서 유지하기
- 가장 이른 사건부터 처리하여 상태 누적하기
schedule은 새 시간이 현재 사건보다 앞설 때까지 이미 정렬된 agenda를 순회합니다. 동일한 타임스탬프는 엄격한 미만(<) 검사를 만족하지 않으므로, 해당 시간의 새 사건은 이미 존재하는 사건들 뒤에 삽입됩니다. 반환된 리스트는 시뮬레이션 시간과 동점 처리 순서를 모두 드러냅니다.
propagate는 가장 이른 사건을 꺼내 그 수치 변화를 signal에 적용하고, 결과 상태를 해당 사건 시간 옆에 기록합니다. agenda는 논리적 시뮬레이션 시간을 모델링하며, 이 예제들은 명시적인 삽입 규칙에 따라 각 사건을 순서대로 처리합니다.
SICP 코드UTF-8 407 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
실행 추적0 / 0 개 이벤트
첫 번째 프로그램은 ((2 sense) (5 open) (5 close))를 반환합니다. 두 번째 프로그램은 ((2 1) (4 4) (5 14))를 반환합니다.
각 사건이 자신의 타임스탬프 위치에 도달할 때까지 schedule의 비교 과정을 따라가세요. 그런 다음 propagate가 2, 4, 5 시간을 순서대로 꺼내는 동안 signal이 1, 4, 14가 되는 과정을 관찰하세요. 이 실행 흐름은 이 agenda와 명시적인 동점 규칙만을 설명합니다.
프로그램을 수정하고 결과를 비교해 보세요.
첫 번째 프로그램에서 시간 1에 reset이라는 이름의 사건을 스케줄해 보세요. 삽입 규칙을 바꾸지 않고 그 위치를 예측해 보세요.
힌트 보기
새 타임스탬프는 agenda에 이미 있는 모든 사건보다 앞섭니다.