Вчера я был на съезде StackOverflow Dev Days, и один из докладчиков говорил о Python. Он показал функцию Memoize, и я спросил, есть ли какой-нибудь способ не допустить ее использования в не чистой функции. Он сказал, что нет, это в принципе невозможно, и если кто-то сможет найти способ сделать это, то получится отличная кандидатская диссертация.
Меня это смутило, потому что компилятору / интерпретатору не так уж сложно решить рекурсивно. В псевдокоде:
function isPure(functionMetadata): boolean;
begin
result = true;
for each variable in functionMetadata.variablesModified
result = result and variable.isLocalToThisFunction;
for each dependency in functionMetadata.functionsCalled
result = result and isPure(dependency);
end;
Это основная идея. Очевидно, вам понадобится какая-то проверка, чтобы предотвратить бесконечную рекурсию взаимозависимых функций, но это не так уж сложно настроить.
Функции высшего порядка, которые принимают указатели на функции, могут быть проблематичными, так как они не могут быть проверены статически, но мой оригинальный вопрос предполагает, что компилятор имеет какое-то ограничение языка, чтобы указать, что только чистый указатель на функцию может быть передан определенный параметр. Если таковой существует, его можно использовать для выполнения условия.
Очевидно, что это будет проще в скомпилированном языке, чем в интерпретируемом, поскольку весь этот перебор чисел будет выполняться до выполнения программы, поэтому ничего не замедлится, но я не вижу каких-либо фундаментальных проблем, которые могли бы сделать невозможным оценку.
Кто-нибудь с немного большим знанием в этой области знает, что мне не хватает?