Guido Von Rossum
Da un'intervista a Guido Van Rossum , che può essere visto in full text con books.google.com (sottolineatura mia):
La scelta del rientro per il raggruppamento non era un nuovo concetto in Python; L'ho ereditato da ABC , ma si è verificato anche in occam, una lingua più vecchia. Non so se gli autori della ABC abbiano preso l'idea dall'occam, o se la abbiano inventata indipendentemente, o se ci fosse un antenato comune. Certo, avrei potuto ha scelto di non seguire l'esempio di ABC, come ho fatto in altri settori (ad esempio, ABC maiuscolo utilizzato per parole chiave del linguaggio e nomi di routine, un'idea non ho copiato), ma mi era venuto a come la funzione piuttosto una un po 'mentre si usa l'ABC, in quanto sembrava eliminare un certo tipo di dibattito inutile comune tra gli utenti C all'epoca, su dove posizionare le parentesi graffe .
Von Rossum fu fortemente ispirato dall'ABC e, sebbene non fosse costretto a copiarlo interamente, l'uso della rientranza fu mantenuto perché poteva essere utile per evitare guerre di religione.
Ero anche ben consapevole del fatto che il codice leggibile usa volontariamente il rientro per indicare il raggruppamento, e mi ero imbattuto in sottili bug nel codice in cui il rientro non era d'accordo con il raggruppamento sintattico usando parentesi graffe: il programmatore e tutti i revisori avevano ipotizzato che il rientro corrispondesse al raggruppamento e quindi non notato il bug. Ancora una volta, una lunga sessione di debug ha insegnato una lezione preziosa.
Rossum ha anche assistito a bug a causa dell'incongruenza tra raggruppamento e rientro, e apparentemente sebbene basarsi sull'indentazione solo per strutturare il codice sarebbe più sicuro dagli errori di programmazione 1 .
Donald E. Knuth e Peter J. Landin
Nell'intervista citata, Guido menziona l'idea di Don Knuth di usare il rientro. Questo è dettagliato in La citazione dell'indentazione di Knuth riscoperta , che cita la programmazione strutturata con dichiarazioni goto . Knuth fa anche riferimento ai prossimi 700 linguaggi di programmazione di Peter John Landin (vedere la sezione Discussione sull'indentazione). Landin ha progettato ISWIM che assomiglia alla prima lingua con rientro anziché blocco iniziale / finale. Questi documenti riguardano più la fattibilità dell'uso del rientro per strutturare i programmi piuttosto che argomenti reali a favore di ciò.
1. Penso che questo sia in realtà un argomento a favore di avere sia costrutti di raggruppamento che di formattazione automatica, al fine di catturare e recuperare da errori di programmazione, che sono destinati ad accadere. Se rovini il rientro in Python, la persona che esegue il debug del tuo codice dovrà indovinare quale sia corretto:
if (test(x)):
foo(x)
bar(x)
Verrà bar
sempre chiamato o solo se il test avrà esito positivo?
I costrutti di raggruppamento aggiungono un livello di ridondanza che consente di individuare un errore durante il rientro automatico del codice. In C, il codice equivalente può essere indentato automaticamente come segue:
if (test(x))
foo(x);
bar(x);
Se intendevo bar
essere allo stesso livello di foo
, il rientro automatico basato sulla struttura del codice mi fa vedere che c'è qualcosa di sbagliato che può essere risolto aggiungendo parentesi graffe foo
e bar
.
In Python: Myths about Indentation , c'è un presunto cattivo esempio di C:
/* Warning: bogus C code! */
if (some condition)
if (another condition)
do_something(fancy);
else
this_sucks(badluck);
È lo stesso caso di cui sopra, in Emacs, evidenzio l'intero blocco / funzione, premo Tab e quindi viene reindirizzato tutto il codice. La discrepanza tra rientro umano e struttura del codice mi dice che qualcosa non funziona (questo e il commento precedente!).
Inoltre, il codice intermedio in cui il rientro è disattivato in C semplicemente non riesce a passare attraverso il ramo master, tutti i controlli di stile in atto mi farebbero gridare da GCC / Jenkins. Di recente ho avuto un problema simile a quello descritto sopra in Python, con una dichiarazione di un livello di rientro. A volte ho un codice in C che va oltre una parentesi graffa di chiusura, ma poi premo Tab e il codice rientra "erroneamente": è un'altra possibilità per vedere il bug.
let x =1; y = 2; z = 3
è completamente valido, così com'èdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Quelli non hanno bisogno di essere sulla stessa linea.