sicp.io
4.2.3 · 평가 전략을 데이터로

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를 읽습니다.

    이 수업 완료하기

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