Я изучаю Haskell, и я искал инструмент для автоматического отступа. Я не особо выглядел и узнал, что в Haskell (как в Python) отступы означают блок. В результате я предполагаю, что невозможно создать инструмент автоматического форматирования, такой же сильный, как в других языках семейства C, в котором используются явные маркеры, такие как {} (фигурные скобки) или begin
end
ключевые слова.
Я не возражаю против языка, обеспечивающего отступы для удобства чтения, но я не могу понять преимущества по сравнению с применением отступов и наличием некоторого явного маркера, так что автоматизированные инструменты могут понять, что принадлежит тому или иному блоку.
Если предпочтение заключается в том, чтобы пометить блок как отступ, чтобы код выглядел лучше, тогда я все еще не понимаю преимущества. Учитывая, что табуляция и пробелы представлены по-разному в разных редакторах и разных шрифтах (например, моно-пробелы выглядят аккуратнее), программист не может представить код достойно. Инструмент, который может учитывать текущий текстовый редактор, будет гораздо более подходящим для правильного форматирования кода.
Почему разработчик языка выбирает отступ вместо явных блочных маркеров?
источник
let x =1; y = 2; z = 3
полностью действителен, как естьdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Те не должны быть на одной линии.Ответы:
Гвидо фон Россум
Из интервью с Гвидо Ван Россумом , которое можно увидеть в полном тексте с books.google.com (выделено мое):
Фон Россум был сильно вдохновлен ABC , и хотя ему не нужно было копировать все это, использование отступов было сохранено, потому что это могло быть полезно во избежание религиозных войн.
Россум также засвидетельствовал ошибки из-за несоответствия между группировкой и отступом, и, очевидно, хотя полагание, что использование отступа только для структурирования кода будет более защищено от ошибок программирования 1 .
Дональд Э. Кнут и Питер Дж. Ландин
В упомянутом интервью Гвидо упоминает идею Дона Кнута об использовании отступов. Это подробно описано в « Обнаруженной цитате отступа Кнута» , которая цитирует структурированное программирование с помощью операторов goto . Кнут также ссылается на следующие 700 языков программирования Питера Джона Ландина (см. Раздел «Обсуждение»). Ландин разработал ISWIM, который выглядит как первый язык с отступом вместо блоков начала / конца. Эти документы больше о целесообразности использования отступов для структурирования программ, чем о реальных аргументах в пользу этого.
1. Я думаю, что это на самом деле аргумент в пользу наличия как группирующих конструкций, так и автоматического форматирования, чтобы выявлять и исправлять ошибки программирования, которые неизбежно произойдут. Если вы испортили свой отступ в Python, человек, который отладит ваш код, должен будет угадать, что правильно:
Должен
bar
всегда быть вызван или только если тест успеха?Группирующие конструкции добавляют уровень избыточности, который помогает вам обнаружить ошибку при автоматическом отступе кода. В C эквивалентный код может быть автоматически вставлен следующим образом:
Если я собирался
bar
быть на том же уровне, чтоfoo
и авто-отступ, основанный на структуре кода, то я вижу, что есть что-то неправильное, что можно исправить, добавив фигурные скобкиfoo
иbar
.В Python: мифы об отступах есть предположительно плохой пример из C:
Это тот же случай, что и выше, в Emacs, я выделяю весь блок / функцию, нажимаю Tab, а затем весь код переопределяется. Расхождение между человеческими отступами и структурой кода говорит мне о том, что что-то не так (это и предыдущий комментарий!).
Кроме того, промежуточный код, где отступ в C отключен, просто не проходит через главную ветку, все проверки стилей заставили бы GCC / Jenkins кричать на меня. У меня недавно была проблема, похожая на описанную выше в Python, с оператором, отступившим на один уровень отступа. Иногда у меня есть код на C, который выходит за пределы закрывающей скобки, но затем я нажимаю Tab и код «отступает»: это еще один шанс увидеть ошибку.
источник
Это очень субъективно и является причиной многих пламенных войн. Однако:
Наличие символов, разделяющих блоки и отступы, нарушает принцип DRY , поскольку вы выражаете одну и ту же информацию двумя разными способами. Наличие автоматических инструментов для отступов является признаком этого нарушения DRY: то, что вы можете автоматически генерировать отступы, показывает, что это избыточная информация, и это означает, что отступы и символы могут быть не синхронизированы, что приведет к вводящему в заблуждение коду.
Часто задаваемые вопросы по Python Design and History очень четко говорят об этом:
Это правда, что вы не можете создать инструмент автоматического отступа для Python, но это хорошо: это означает, что у вас нет избыточности в синтаксисе, для которой вам нужны автоматические инструменты для согласования.
В Python допустимо использование табуляции и пробелов, поэтому рекомендуется никогда не смешивать табуляцию и пробелы (для отступов) в одной кодовой базе.
Python унаследовал значительные отступы от (ныне устаревшего) языка предшественника ABC. ABC - один из немногих языков программирования, который использовал юзабилити-тестирование для управления дизайном. Таким образом, хотя обсуждение синтаксиса обычно сводится к субъективным мнениям и личным предпочтениям, выбор существенного отступа на самом деле имеет более прочную основу.
источник
pass
ключевое слово, которое может быть выведено автоматически, но требование его явного указания помогает обнаружить ошибки. Случайная избыточность наличия символов начала / конца (для компилятора) и отступа (для читателя-человека), кажется, вызывает больше ошибок, чем ловит. По крайней мере, это похоже на мнение ван Россума.PROCEDURE DIVISION.
тоже скучаешь по Коболу ? Я никогда не могу сказать, где, гдеDATA DIVISION
заканчивается, и процедуры начинаются на этих новомодных языках.Разработчики языка выбирают синтаксически значимые пробелы, потому что они верят (или, по крайней мере, думают, что их потенциальные пользователи считают), что точки с запятой и фигурные скобки добавляют шум при чтении кода, снижая производительность. Другая распространенная причина заключается в том, что плохой / несовместимый стиль кодирования вредит читабельности - благодаря использованию общей схемы отступов язык в целом лучше читается. Эта более поздняя причина менее важна сейчас, когда автоформатирование IDE более распространено, но все еще может применяться.
источник