같은 식이 더 이상 같은 계산을 뜻하지 않을 수 있다.
프로시저 호출이 기억한 위치를 바꿀 때 나타나는 이력 의존성, 순서 의존성, 별칭에 민감한 관찰을 드러냅니다.
생각해 볼 질문
식이 상태를 바꿀 수 있다면 어떤 치환과 순서 변경 논리가 더 이상 성립하지 않을까요?
- 되풀이한 상태 호출과 되풀이한 순수 호출 비교하기
- 같은 소스 식이 시간에 따라 다른 값을 만들 수 있음을 알아보기
- 피연산자 순서를 가정하지 않고 두 평가 일정을 명시적으로 쓰기
- 앞선 호출이 뒤 호출의 의미를 바꾸는 과정 관찰하기
- 유한 일정과 그 평가 순서를 정확히 기록하기
같은 withdraw 프로시저에 같은 인자 10을 두 번 주어도 첫 호출이 포획한 balance를 바꾸므로 90과 80을 반환합니다. 두 호출을 앞에서 계산한 값 하나로 치환하면 프로그램이 달라집니다. 순수한 withdraw-value는 숨은 이력이 없어 같은 명시적 balance에서 시작한 두 호출 모두 90입니다.
순서 probe는 let 바인딩으로 일정 의존성을 소스에 직접 적습니다. zero 메시지를 먼저 부르면 one 메시지가 읽기 전에 상태가 바뀝니다. one을 먼저 부르면 예전 상태를 봅니다. 여기의 결론은 평가기가 피연산자를 어느 순서로 고르는지에 기대지 않습니다.
SICP 코드UTF-8 333 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
실행 추적0 / 0 개 이벤트
반복 프로그램은 (90 80 90 90)을 반환합니다. 명시적 일정은 ((0 1 1) (0 0 0))을 반환합니다.
동일한 두 상태 호출 사이의 balance 대입을 찾고 순수 호출에는 지속되는 위치가 없는지 확인하세요. 일정 비교에서는 첫 호출과 둘째 호출을 순서대로 따라가며 어느 읽기의 값이 바뀌는지 찾으세요.
프로그램을 수정하고 결과를 비교해 보세요.
순서 probe에 reset 메시지를 더하고 zero–reset–one과 zero–one–reset을 비교하세요. 어떤 대수적 치환이나 호출 순서 변경이 각 관찰을 바꾸는지 설명하세요.
힌트 보기
모든 호출을 중첩 let으로 적어 일정을 인자 평가 가정이 아니라 소스의 일부로 만드세요.