Гвідо Фон Россум
З інтерв'ю з Гвідо Ван Россумом , який можна побачити в повному обсязі з books.google.com (моє наголос):
Вибір відступу для групування не був новітньою концепцією в Python; Я успадкував це від ABC , але це траплялося і в оккамі, більш старій мові. Я не знаю, чи автори АБВ отримали ідею з оккаму, чи винайшли її самостійно, чи був спільний пращур. Звичайно, я міг би вирішити не брати участь у програмі ABC, як це робилося в інших областях (наприклад, ABC використовував великі регістри мовних ключових слів та назви процедур, ідею, яку я не копіював), але мені ця функція дуже сподобалась Біт під час використання ABC, як здавалося, усуває певний тип безглуздих дискусій, поширених серед користувачів на той час, щодо того, де розмістити фігурні дужки .
Фон Россум був сильно натхненний ABC , і хоча йому не довелося копіювати все це, використання відступів зберігався, оскільки це може бути корисним для уникнення релігійних воєн.
Я також добре розумів, що читабельний код так чи інакше використовує відступ для вказівки на групування, і я натрапив на непомітні помилки в коді, де відступ не погоджувався із синтаксичним угрупованням за допомогою фігурних дужок - програміст та будь-які рецензенти припускали, що відступ відповідає групуванню і тому не помітив помилку. Знову тривалий налагоджувальний сеанс навчив цінного уроку.
Россум також був свідком помилок через невідповідність між групуванням і відступом, і, мабуть, хоч таке покладання на відступ лише для структури коду було б безпечніше від помилок програмування 1 .
Дональд Е. Кнут та Пітер Дж. Ландін
У згаданому інтерв'ю Гідо згадує ідею Дон Кнута про використання відступів. Про це детально йдеться у перетвореній цитаті відступу Knuth , в якій цитується Структурне програмування з goto Statements . Кнут також згадує наступні 700 мов програмування Пітера Джона Ландіна (див. Розділ «Дискусія про відступ») Ландін розробив ISWIM, схожий на першу мову з відступом замість блоків початку / кінця. Ці документи більше стосуються доцільності використання відступу для структурування програм, а не фактичних аргументів на користь цього.
1. Я думаю, що це насправді аргумент на користь як групуючих конструкцій, так і автоматичного форматування, щоб зловити та відновити помилки програмування, які повинні бути. Якщо ви відкрутите відступ у Python, людині, яка налагоджує ваш код, доведеться здогадатися, що правильно:
if (test(x)):
foo(x)
bar(x)
Чи bar
завжди потрібно дзвонити чи лише у випадку успіху тесту?
Конструкти групування додають рівень надмірності, який допоможе вам виявити помилку під час автоматичного відступу коду. У C еквівалентний код може бути автоматично відведений таким чином:
if (test(x))
foo(x);
bar(x);
Якщо я мав на bar
меті бути на такому ж рівні foo
, то автоматичне відступ на основі структури коду дозволить мені побачити, що є щось не так, що можна виправити, додавши дужки навколо foo
та bar
.
У Python: Міфи про відступ , є нібито поганий приклад з C:
/* Warning: bogus C code! */
if (some condition)
if (another condition)
do_something(fancy);
else
this_sucks(badluck);
Це той самий випадок, що і вище, в Emacs я виділяю весь блок / функцію, натискаю Tab, а потім весь код повторюється. Невідповідність між відступом людини та структурою коду говорить про те, що щось не вдається (це та попередній коментар!).
Крім того, проміжний код, де відступ вимикається в C, просто не робить його через головну гілку, всі перевірені стилі на місці змусять GCC / Jenkins кричати на мене. Нещодавно у мене виникла проблема, аналогічна описаній вище в Python, із заявою, відключеною на один рівень відступу. Іноді в мене є код на C, який виходить за рамки закриття дужки, але тоді я натискаю Tab і відступи коду "неправильно": це ще один шанс побачити помилку.
let x =1; y = 2; z = 3
є повністю дійсним, як єdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Тим не потрібно бути на одній лінії.