같은 guest 적용을 strict 평가기와 메모이즈하지 않은 정상 순서 평가기로 실행하고 사용하지 않은 인자와 두 번 참조한 인자의 probe 횟수를 셉니다.
생각해 볼 질문
평가기 두 개가 같은 값을 반환하면서도 서로 다른 인자 작업을 수행할 수 있는 이유는 무엇일까요?
strict compound 적용 전에 모든 피연산자 평가하기
평가하지 않은 피연산자 식을 정상 순서 thunk로 바인딩하기
변수 조회가 값을 필요로 할 때만 thunk 강제하기
사용하지 않은 인자를 두 전략에서 관찰하기
정상 순서 매개변수를 두 번 참조할 때 중복 작업 관찰하기
명시적인 두 guest 평가 전략 비교하기
strict-eval은 compound procedure를 적용하기 전에 피연산자를 평가합니다. 따라서 본문이 1만 반환하고 x를 쓰지 않아도 인자 probe는 한 번 호출됩니다. normal-eval은 x를 피연산자 식과 환경을 담은 thunk로 바인딩합니다. 본문이 x를 조회하지 않으므로 probe는 실행되지 않습니다.
두 번째 식은 본문에서 x를 두 번 사용합니다. strict 평가는 probe를 한 번 계산하고 결과 10을 바인딩합니다. 메모이즈하지 않은 정상 평가기는 조회마다 저장한 식을 강제하므로 probe를 두 번 실행합니다. 둘 다 20을 반환하지만 작업량은 다릅니다. 두 평가기는 명시적인 guest 모형이며 실행 중인 호스트 리스펙스의 평가 순서를 바꾸지 않습니다.
프로그램은 ((unused (1 1) (1 0)) (duplicated (20 1) (20 2)))를 반환합니다. 각 pair는 값과 probe 호출 수입니다.
실행 추적에서 볼 점
strict-eval에서는 compound 본문이 시작하기 전에 probe를 찾으세요. normal-eval에서는 각 매개변수 바인딩을 thunk까지 따라가고 변수 조회에서만 강제되는지 확인하세요. unused 본문은 강제하지 않고 duplicated 본문은 이 모형이 메모이즈하지 않으므로 같은 thunk 식에 두 번 도달합니다.
직접 해보기
프로그램을 수정하고 결과를 비교해 보세요.
((lambda (x) (+ x (+ x x))) (probe 4))를 추가하세요. strict와 normal의 probe 횟수를 예상한 뒤 thunk에 memo 셀을 추가했을 때 call-by-need 횟수를 예상하세요.
힌트 보기
strict는 인자를 한 번 계산합니다. 메모이즈하지 않은 normal은 x 조회마다 계산하고 memoized thunk는 최대 한 번 계산합니다.