D의 pure는 단어가 주는 느낌보다 약해요. 평가기 실험에서 호출을 캐시하려다가 그제야 알아챘어요.
int[] log;
pure void bump(int[] a)
{
a[0]++; // fine, writes through the argument
// log ~= a[0]; // rejected, touches a mutable global
}
D에서 pure는 변경 가능한 전역이나 정적 상태에 접근하지 않는다는 뜻이에요. 매개변수로 닿을 수 있는 메모리를 바꾸는 건 막지 않아요. 스펙은 이걸 약한 순수성이라고 불러요. 호출을 캐시할 수 있는 건 매개변수가 변경 가능한 간접 참조를 가질 수 없을 때, 즉 immutable 데이터나 그냥 값일 때뿐이고, 그게 강한 순수성이에요. 키워드는 같고, 어느 쪽이 될지는 매개변수 타입이 정해요.
그러니 평가기가 pure 호스트 함수의 결과를 캐시한다면, 속성만 보고 키를 잡을 경우 bump도 캐시되고 두 번째 호출은 쓰기를 건너뛰게 돼요. 대신 강하게 순수한 시그니처로 키를 잡을까요? 아니면 조건 목록이 길어져서 호스트 쪽에서 명시적으로 켜는 속성을 두는 게 더 간단할까요?