thunk는 일을 미루고 값을 기억한다.
태그가 붙은 가변 객체로 계산을 보류한 뒤 첫 force 결과로 표현을 바꿀 수 있습니다.
생각해 볼 질문
call-by-need를 평가기 안에서 보이게 하는 표현 변화는 무엇일까요?
- 지연된 작업을 태그가 붙은 가변 벡터로 나타내기
- 평가되지 않은 thunk와 평가된 thunk 구분하기
- 값이 요구될 때만 보류된 계산 force하기
- 나중의 요구를 위해 첫 값 메모이즈하기
make-thunk는 thunk 태그와 인자가 없는 계산과 빈 결과 슬롯을 저장합니다. 이 벡터를 생성해도 계산은 호출되지 않으므로 아무도 요구하지 않는다면 실패할 본문조차 무해하게 남아 있을 수 있습니다.
force-it은 태그를 검사합니다. 첫 번째 요구에서는 저장된 계산을 호출하고 태그를 evaluated-thunk로 바꾸며 계산을 버리고 값을 저장합니다. 이후의 요구는 캐시된 슬롯을 선택하며 계산을 다시 수행하지 않습니다. 이는 게으른 평가기가 평소에 인자 처리 뒤에 숨겨 두는 표현 변화를 드러냅니다.
SICP 코드UTF-8 607 / 1,048,576바이트
예제
결과—
- 출력
- —
- 값
- —
- 진단
- —
실행 추적0 / 0 개 이벤트
첫 프로그램은 (10 10 1 evaluated-thunk)를 반환합니다. 두 번째 프로그램은 0으로 나누는 식을 평가하지 않고 (thunk 0)을 반환합니다.
첫 번째 실행에서 저장된 계산의 한 번의 적용과 thunk 표현을 대체하는 벡터 변경을 찾으세요. 두 번째 force는 캐시된 값을 읽습니다. 두 번째 실행에서는 나눗셈 적용이나 calls 대입이 일어나지 않는지 확인하세요.
프로그램을 수정하고 결과를 비교해 보세요.
첫 번째 프로그램에서 delayed를 세 번째로 force하세요. 실행하기 전에 세 값과 calls 횟수와 최종 태그를 예상하세요.
힌트 보기
태그가 evaluated-thunk가 되면 force-it은 슬롯 1을 호출하지 않고 슬롯 2를 읽습니다.