pure в D слабее, чем обещает слово, и заметно это стало только потому, что эксперимент с вычислителем захотел кэшировать вызовы.
int[] log;
pure void bump(int[] a)
{
a[0]++; // fine, writes through the argument
// log ~= a[0]; // rejected, touches a mutable global
}
pure в D значит, что нет доступа к изменяемому глобальному или статическому состоянию. Против изменения памяти, достижимой через параметры, оно ничего не говорит. Спецификация называет это слабой чистотой. Вызов становится тем, что можно кэшировать, только когда параметры не могут нести изменяемых косвенных ссылок, то есть это immutable-данные или простые значения, и это сильная чистота. Ключевое слово одно, а какую из двух получаешь, решают типы параметров.
Так что если вычислитель кэширует результаты pure-функций хоста, ключ по одному атрибуту закэширует и bump, и второй вызов пропустит запись. Брать ключ по сильно чистым сигнатурам? Или список условий становится таким длинным, что проще явный атрибут на стороне хоста, которым функцию включают в кэш?