2015-09-10 12 views
5

Da quando sono entrato in Scala ho iniziato a scrivere funzioni utilizzando la ricorsione a coda e ho appreso che i compilatori C++ supportano anche le funzioni ricorsive della coda. Ora sono curioso di sapere quanto sia affidabile quell'ottimizzazione, e va bene usarlo per cose come il mio ciclo principale o il prompt dei comandi?Scala/C++: funzione ricorsiva di coda invece del ciclo di input

prompt dei comandi Tradizionalmente che ho scritto come questo:

bool running = true; 
string input; 
while(running_){ 
    input = getInput(); 
    executeCommand(input); 
    if(input == "quit") running_ = false; 
} 

Ora sarebbe una brutta cosa per sostituire questo con una funzione ricorsiva di coda in questo modo?

string input = "nothing"; 
void parseInput(){ 
    if(input != "nothing") executeCommand(input); 

    getline(cin, input); 
    if(input != "quit") parseInput(); 
} 
+0

idea fantastica! – UmNyobe

risposta

2

TCO (ottimizzazione chiamata di coda) viene applicato con diversi livelli di affidabilità da diversi compilatori. Nel tuo caso particolare rendi ancora più difficile per il compilatore non tornare immediatamente dopo la chiamata all'interno del ramo. Il compilatore dovrà fare un passo in più per assicurarsi che non ci sia codice che verrà eseguito dopo che la chiamata è stata eseguita.

Per assicurarsi che il TCO sia successo, devi fare affidamento sul tuo migliore amico. Il tuo migliore amico qui è l'uscita di Asm.

+0

Sarebbe più semplice per il compilatore se scrivessi 'if (input! =" Quit ") thisFunction(); else cout << "ciao! \ n"; '? – BigBadWolf

+0

@BigBadWolf, basta inserire il ritorno all'interno del ramo subito dopo la chiamata a questa funzione. – SergeyA

Problemi correlati