Estuve en la convención StackOverflow Dev Days ayer, y uno de los oradores estaba hablando de Python. Mostró una función Memoize, y le pregunté si había alguna manera de evitar que se utilizara en una función no pura. Dijo que no, eso es básicamente imposible, y que si alguien pudiera encontrar la forma de hacerlo, sería una gran tesis doctoral.¿Por qué es determinante si una función es puramente difícil?
Eso me confundió, porque no parece tan difícil para un compilador/intérprete resolver de forma recursiva. En pseudocódigo:
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;
Esa es la idea básica. Obviamente, necesitaría algún tipo de control para evitar la recursión infinita en funciones mutuamente dependientes, pero eso no es demasiado difícil de configurar.
Las funciones de orden superior que toman punteros a funciones pueden ser problemáticas, ya que no se pueden verificar estáticamente, pero mi pregunta original presupone que el compilador tiene algún tipo de limitación de idioma para designar que solo se puede pasar un puntero de función puro a un cierto parámetro. Si existiera uno, podría usarse para satisfacer la condición.
Obviamente esto sería más fácil en un lenguaje compilado que en uno interpretado, ya que todo este proceso de numeración se haría antes de que se ejecute el programa y no desacelerará nada, pero realmente no veo ningún problema fundamental que haría imposible evaluar.
¿Alguien con un poco más de conocimiento en esta área sabe lo que me falta?
Sería cualquier variable * accedida * que debe ser local, no solo modificada. Una función cuyo resultado depende del valor actual de un global, incluso si no modifica ese global, claramente no es puro. – caf
La pregunta obvia: ¿el registro afecta la pureza? Diría que, por el contrario, en realidad MODIFICAR un valor global (si esto no puede arrojarse), no afecta el resultado de su método y, por lo tanto, permite la memorización incluso si claramente no es puro. –