Ieri ero alla convention di StackOverflow Dev Days e uno dei relatori parlava di Python. Mostrò una funzione Memoize e chiesi se esistesse un modo per impedirne l'uso su una funzione non pura. Ha detto no, è praticamente impossibile, e se qualcuno riuscisse a trovare un modo per farlo sarebbe una grande tesi di dottorato.Perché determinare se una funzione è puramente difficile?
Questo tipo di mi ha confuso, perché non sembra così difficile per un compilatore/interprete risolvere in modo ricorsivo. In pseudocode:
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;
Questa è l'idea di base. Ovviamente avresti bisogno di una sorta di controllo per prevenire la ricorsione infinita su funzioni reciprocamente dipendenti, ma non è troppo difficile da configurare.
Le funzioni di ordine superiore che prendono i puntatori di funzione potrebbero essere problematiche, poiché non possono essere verificate staticamente, ma la mia domanda iniziale presuppone che il compilatore abbia una sorta di vincolo di linguaggio per indicare che è possibile passare solo un puntatore a funzione pura ad un certo parametro. Se esistesse, ciò potrebbe essere usato per soddisfare la condizione.
Ovviamente questo sarebbe più semplice in un linguaggio compilato che in uno interpretato, dal momento che tutto questo crunch numerico sarebbe fatto prima che il programma venga eseguito e quindi non rallentare nulla, ma non vedo davvero alcun problema fondamentale che renderebbe impossibile la valutazione.
Qualcuno con un po 'più di conoscenza in questo settore sa cosa mi manca?
Sarebbe qualsiasi variabile * accessibile * che deve essere locale, non solo modificata. Una funzione il cui risultato dipende dal valore corrente di un globale, anche se non modifica quello globale, non è chiaramente puro. – caf
La domanda ovvia: la registrazione influisce sulla purezza? Direi che al contrario, MODIFICA di un valore globale (se questo non può essere lanciato), non influisce sul risultato del metodo, e quindi consente la memoizzazione anche se chiaramente non è puro! –