Guido Von Rossum
De uma entrevista com Guido Van Rossum , que pode ser vista em texto completo em books.google.com (grifo meu):
A escolha do recuo para agrupar não era um conceito novo em Python; Eu herdei isso da ABC , mas também ocorreu no occam, um idioma antigo. Não sei se os autores do ABC obtiveram a idéia do ocam, ou a inventaram independentemente, ou se havia um ancestral comum. Obviamente, eu poderia ter optado por não seguir o exemplo da ABC, como fiz em outras áreas (por exemplo, a ABC usava letras maiúsculas para palavras-chave e nomes de procedimentos, uma ideia que não copiei), mas eu gostei bastante do recurso pouco enquanto usava o ABC, pois parecia acabar com um certo tipo de debate inútil comum entre os usuários de C na época, sobre onde colocar os aparelhos .
Von Rossum foi fortemente inspirado pela ABC e, embora não tivesse que copiar tudo, o uso de indentação foi mantido, porque poderia ser benéfico para evitar guerras religiosas.
Eu também estava bem ciente de que código legível usa indentação voluntariamente de qualquer maneira para indicar o agrupamento, e encontrei bugs sutis no código em que o identificador discordava do agrupamento sintático usando chaves - o programador e quaisquer revisores supunham que o identificador correspondia ao agrupamento. e, portanto, não percebeu o bug. Novamente, uma longa sessão de depuração ensinou uma lição valiosa.
Rossum também testemunhou bugs devido à inconsistência entre o agrupamento e o recuo, e aparentemente apesar de confiar apenas no recuo para estruturar o código seria mais seguro contra erros de programação 1 .
Donald E. Knuth e Peter J. Landin
Na entrevista referenciada, Guido menciona a ideia de Don Knuth de usar indentação. Isso está detalhado em The Knuth Indentation Quote redescoberto , que cita a Programação Estruturada com Instruções Goto . Knuth também faz referência a As próximas 700 linguagens de programação de Peter John Landin (consulte a seção Discussão sobre recuo). Landin projetou o ISWIM, que se parece com o primeiro idioma com recuo em vez de blocos de início / fim. Esses documentos são mais sobre a viabilidade do uso de indentação para estruturar programas, em vez de argumentos reais a favor de fazê-lo.
1. Penso que este é de fato um argumento a favor de ter construções de agrupamento e formatação automática, a fim de capturar e recuperar de erros de programação, que estão prestes a acontecer. Se você estragar o seu recuo no Python, a pessoa que depura seu código terá que adivinhar o que está correto:
if (test(x)):
foo(x)
bar(x)
Deve bar
sempre ser chamado ou apenas se o teste de sucesso?
As construções de agrupamento adicionam um nível de redundância que ajuda a identificar um erro ao recuar automaticamente o código. Em C, o código equivalente pode ser recuado automaticamente da seguinte maneira:
if (test(x))
foo(x);
bar(x);
Se eu pretendia bar
estar no mesmo nível que foo
, então o recuo automático com base na estrutura do código permite ver que há algo errado que pode ser corrigido adicionando chaves entre foo
e bar
.
Em Python: Myths about Indentation , há um exemplo supostamente ruim de C:
/* Warning: bogus C code! */
if (some condition)
if (another condition)
do_something(fancy);
else
this_sucks(badluck);
É o mesmo caso acima, no Emacs, destaco todo o bloco / função, pressiono Tab e todo o código é reindentado. A discrepância entre a indentação humana e a estrutura do código indica que algo está errado (isso e o comentário anterior!).
Além disso, o código intermediário em que a indentação está desativada em C simplesmente não passa pela ramificação principal, todas as verificações de estilo existentes fazem o GCC / Jenkins gritar comigo. Recentemente, tive um problema semelhante ao descrito acima em Python, com uma declaração desativada por um nível de indentação. Às vezes, tenho um código em C que vai além de uma chave de fechamento, mas depois clico em Tab e o código é recuado "incorretamente": essa é mais uma chance de ver o bug.
let x =1; y = 2; z = 3
é completamente válido, como édo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Aqueles não precisam estar na mesma linha.