Guido Von Rossum
Aus einem Interview mit Guido Van Rossum , das im Volltext mit books.google.com (Schwerpunkt Mine) zu sehen ist:
Die Wahl der Einrückung für die Gruppierung war in Python kein neuartiges Konzept. Ich habe dies von ABC geerbt , aber es kam auch in Occam vor, einer älteren Sprache. Ich weiß nicht, ob die ABC-Autoren die Idee von Occam haben oder sie unabhängig erfunden haben oder ob es einen gemeinsamen Vorfahren gab. Natürlich hätte ich mich dafür entscheiden können, ABCs Vorbild nicht zu folgen, wie ich es in anderen Bereichen getan habe (z. B. verwendete ABC Großbuchstaben für Sprachschlüsselwörter und Prozedurnamen, eine Idee, die ich nicht kopiert habe), aber mir gefiel die Funktion ziemlich gut Während der Verwendung von ABC schien dies eine bestimmte Art von sinnloser Debatte zu beseitigen, die zu dieser Zeit unter C- Benutzern üblich war, wo die geschweiften Klammern platziert werden sollten .
Von Rossum war stark von ABC inspiriert , und obwohl er nicht alles kopieren musste, wurde die Verwendung von Einrückungen beibehalten, da dies zur Vermeidung von Religionskriegen von Vorteil sein könnte.
Mir war auch bewusst, dass lesbarer Code Einrückungen freiwillig verwendet , um eine Gruppierung anzuzeigen, und ich hatte subtile Fehler im Code festgestellt, bei denen die Einrückung nicht mit der syntaktischen Gruppierung in geschweiften Klammern übereinstimmte - der Programmierer und alle Prüfer hatten angenommen, dass die Einrückung mit der Gruppierung übereinstimmte und deshalb den Fehler nicht bemerkt. Wiederum lehrte eine lange Debugging-Sitzung eine wertvolle Lektion.
Rossum sah auch Fehler aufgrund von Inkonsistenzen zwischen Gruppierung und Einzug, und anscheinend wäre es sicherer, wenn man sich nur auf Einrückungen stützt, um den Code zu strukturieren, vor Programmierfehlern 1 .
Donald E. Knuth und Peter J. Landin
In dem Interview, auf das verwiesen wird, erwähnt Guido Don Knuths Idee, Einrückungen zu verwenden. Dies wird in The Knuth Indentation Quote (Wiederentdeckung des Knuth-Einrückungszitats) beschrieben , in dem die strukturierte Programmierung mit goto-Anweisungen zitiert wird . Knuth verweist auch auf Peter John Landins Die nächsten 700 Programmiersprachen (siehe Abschnitt Diskussion über Einrückungen). Landin hat ISWIM entworfen, das wie die erste Sprache mit Einrückung anstelle von Start- / Endblöcken aussieht. In diesen Papieren geht es eher um die Machbarkeit der Verwendung von Einrückungen zur Strukturierung von Programmen als um tatsächliche Argumente dafür.
1. Ich denke, dass dies in der Tat ein Argument für Gruppierungskonstrukte und automatische Formatierung ist, um Programmierfehler zu erkennen und zu beheben, die zwangsläufig auftreten werden. Wenn Sie Ihre Einrückung in Python vermasseln, muss die Person, die Ihren Code debuggt, raten, welche richtig ist:
if (test(x)):
foo(x)
bar(x)
Soll bar
immer aufgerufen werden oder nur wenn der Test erfolgreich ist?
Gruppierungskonstrukte fügen eine Redundanzstufe hinzu, mit der Sie einen Fehler erkennen können, wenn Sie Ihren Code automatisch einrücken. In C kann der entsprechende Code wie folgt automatisch eingerückt werden:
if (test(x))
foo(x);
bar(x);
Wenn ich beabsichtigte bar
, auf dem gleichen Niveau wie zu sein foo
, kann ich durch automatisches Einrücken basierend auf der Codestruktur feststellen, dass etwas nicht stimmt, das durch Hinzufügen von geschweiften Klammern um foo
und behoben werden kann bar
.
In Python: Mythen über Einrückung gibt es ein angeblich schlechtes Beispiel aus C:
/* Warning: bogus C code! */
if (some condition)
if (another condition)
do_something(fancy);
else
this_sucks(badluck);
Das ist der gleiche Fall wie oben. In Emacs hebe ich den gesamten Block / die gesamte Funktion hervor, drücke die Tabulatortaste und dann wird der gesamte Code neu eingerückt. Die Diskrepanz zwischen menschlicher Einrückung und Codestruktur sagt mir, dass etwas nicht stimmt (das und der vorhergehende Kommentar!).
Außerdem schafft es der Zwischencode, bei dem die Einrückung in C deaktiviert ist, einfach nicht durch den Hauptzweig. Alle vorhandenen Stilprüfungen würden GCC / Jenkins dazu bringen, mich anzuschreien. Ich hatte kürzlich ein ähnliches Problem wie das oben in Python beschriebene, mit einer Aussage, die durch eine Einrückungsstufe abweicht. Manchmal habe ich Code in C, der über eine schließende Klammer hinausgeht, aber dann drücke ich die Tabulatortaste und der Code wird "falsch" eingerückt: Das ist eine weitere Chance, den Fehler zu sehen.
let x =1; y = 2; z = 3
ist so wie es ist völlig gültigdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Diese müssen nicht in derselben Zeile stehen.