Guido Von Rossum
Z wywiadu z Guido Van Rossumem , który można zobaczyć w pełnym tekście na books.google.com (moje wyróżnienie ):
Wybór wcięcia dla grupowania nie był nową koncepcją w Pythonie; Odziedziczyłem to po ABC , ale zdarzało się to również w starszym języku occam. Nie wiem, czy autorzy ABC wpadli na pomysł od czasu do czasu, czy wymyślili go niezależnie, czy też był wspólny przodek. Oczywiście mogłem zdecydować się nie podążać za wskazówkami ABC, tak jak robiłem to w innych obszarach (np. ABC używał wielkich liter w słowach kluczowych i nazwach procedur, pomysł, którego nie kopiowałem), ale polubiłem tę funkcję dość nieco podczas korzystania z ABC, ponieważ wydawało się, że eliminuje on pewien rodzaj bezcelowej debaty powszechnej w tym czasie wśród użytkowników C, na temat tego, gdzie umieścić nawiasy klamrowe .
Von Rossum był mocno zainspirowany ABC i chociaż nie musiał kopiować wszystkiego, użycie wcięcia zostało zachowane, ponieważ może być korzystne w unikaniu wojen religijnych.
Byłem również świadomy, że czytelny kod i tak używa dobrowolnego wcięcia w celu wskazania grupowania, i natknąłem się na subtelne błędy w kodzie, w których wcięcie nie zgadzało się z grupowaniem składniowym za pomocą nawiasów klamrowych - programista i recenzenci przyjęli, że wcięcie pasuje do grupowania i dlatego nie zauważyłem błędu. Ponownie długa sesja debugowania udzieliła cennej lekcji.
Rossum był także świadkiem błędów spowodowanych niespójnością między grupowaniem a wcięciem i najwyraźniej poleganie na wcięciach jedynie w strukturze kodu byłoby bezpieczniejsze od błędów programowych 1 .
Donald E. Knuth i Peter J. Landin
W cytowanym wywiadzie Guido wspomina pomysł Dona Knutha na użycie wcięcia. Jest to szczegółowo opisane w cytacie „Knuth Indentation Quote” , który cytuje programowanie strukturalne za pomocą instrukcji goto . Knuth odwołuje się także do następnych 700 języków programowania Petera Johna Landina (patrz sekcja Dyskusje na temat wcięć). Landin zaprojektował ISWIM, który wygląda jak pierwszy język z wcięciami zamiast bloków początkowych / końcowych. W tych dokumentach chodzi raczej o możliwość zastosowania wcięcia w programach do strukturyzacji, a nie o faktyczne argumenty przemawiające za tym.
1. Myślę, że jest to w rzeczywistości argument przemawiający za posiadaniem zarówno konstrukcji grupujących, jak i automatycznego formatowania, w celu wychwytywania i odzyskiwania po błędach programistycznych, które muszą się zdarzyć. Jeśli zepsujesz wcięcie w Pythonie, osoba debugująca Twój kod będzie musiała zgadnąć, co jest poprawne:
if (test(x)):
foo(x)
bar(x)
Czy bar
zawsze zadzwonię, czy tylko wtedy, gdy test się powiedzie?
Konstrukcje grupujące dodają poziom redundancji, który pomaga wykryć błąd podczas automatycznego wcięcia kodu. W języku C równoważny kod może być automatycznie wcięty w następujący sposób:
if (test(x))
foo(x);
bar(x);
Jeśli chciałem bar
być na tym samym poziomie co foo
, to automatyczne wcięcie oparte na strukturze kodu pozwala mi zobaczyć, że istnieje coś złego, co można naprawić, dodając nawiasy klamrowe wokół foo
i bar
.
W Python: Myths about Indentation istnieje podobno zły przykład z C:
/* Warning: bogus C code! */
if (some condition)
if (another condition)
do_something(fancy);
else
this_sucks(badluck);
Tak samo jak powyżej, w Emacsie podświetlam cały blok / funkcję, naciskam Tab, a następnie cały kod jest ponownie dodawany. Rozbieżność między ludzkimi wcięciami a strukturą kodu mówi mi, że coś jest nie tak (to i poprzedni komentarz!).
Poza tym, kod pośredni, w którym wcięcie jest wyłączone w C, po prostu nie przechodzi przez gałąź master, wszystkie sprawdzenia stylu sprawiłyby, że GCC / Jenkins krzyczałby na mnie. Niedawno miałem problem podobny do opisanego powyżej w Pythonie, ze stwierdzeniem wyłączonym przez jeden poziom wcięcia. Czasami mam kod w C, który wykracza poza nawias zamykający, ale potem wciskam Tab i kod wcina się „niepoprawnie”: to kolejna szansa na zobaczenie błędu.
let x =1; y = 2; z = 3
jest całkowicie ważne, tak jak jestdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Te nie muszą znajdować się na tej samej linii.