Estou aprendendo Haskell e estava procurando uma ferramenta de indentação automática. Não olhei muito e aprendi que em Haskell (como em Python), o recuo significa um bloco. Como resultado, acho que é impossível criar uma ferramenta de formatação automática, tão forte quanto em outros idiomas da família C, que use marcadores explícitos, como {} (chaves) ou begin
end
palavras-chave.
Não me importo com uma linguagem que imponha recuo para facilitar a leitura, mas não consigo entender os benefícios de impor recuo e ter algum marcador explícito, para que ferramentas automatizadas possam entender o que pertence a qual bloco.
Se a preferência de indentação marcando um bloco é para que o código pareça melhor, ainda não entendo a vantagem. Dado que guias e espaços são representados de maneira diferente em diferentes editores e fontes diferentes (fontes monoespaços, por exemplo, parecem mais organizadas), é inviável esperar que o programador apresente o código decentemente. Uma ferramenta que considere o editor de texto atual seria muito mais apropriada para formatar o código corretamente.
Por que um designer de linguagem escolheria recuo sobre marcadores de bloco explícitos?
fonte
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.Respostas:
Guido Von Rossum
De uma entrevista com Guido Van Rossum , que pode ser vista em texto completo em books.google.com (grifo meu):
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.
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:
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:
Se eu pretendia
bar
estar no mesmo nível quefoo
, 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 entrefoo
ebar
.Em Python: Myths about Indentation , há um exemplo supostamente ruim de C:
É 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.
fonte
Isso é altamente subjetivo e causa de muitas guerras de chamas. Contudo:
Ter símbolos que delimitam blocos e recuo viola o princípio DRY , pois você expressa as mesmas informações de duas maneiras diferentes. A existência de ferramentas de indentação automatizadas é um sintoma dessa violação DRY: O fato de você poder gerar automaticamente o recuo mostra que são informações redundantes e significa que o recuo e os símbolos podem ficar fora de sincronia, o que leva a códigos enganosos.
As Perguntas frequentes sobre design e história do Python afirma isso muito claramente:
É verdade que você não pode criar uma ferramenta de recuo automático para Python, mas isso é uma coisa boa: significa que você não possui redundâncias na sintaxe que precisa de ferramentas automatizadas para reconciliar.
As abas versus espaços é uma preocupação legítima no Python, e é recomendável nunca misturar abas e espaços (para indentação) na mesma base de código.
Python herdou a indentação significativa da linguagem predecessora ABC (agora obsoleta). O ABC é uma das poucas linguagens de programação que usaram testes de usabilidade para direcionar o design. Portanto, enquanto discussões sobre sintaxe geralmente se resumem a opiniões subjetivas e preferências pessoais, a escolha de um recuo significativo realmente tem uma base mais sólida.
fonte
pass
palavra - chave que pode ser inferida automaticamente, mas exigir que seja explícita ajuda a descobrir erros. A redundância acidental de ter símbolos de início / fim (para o compilador) e indentação (para o leitor humano) parece causar mais erros do que os detectados. Pelo menos isso parece ser o ponto de vista de van Rossum.PROCEDURE DIVISION.
? Nunca sei onde é que osDATA DIVISION
fins e os procedimentos começam nessas novas linguagens.Os designers de idiomas escolhem espaços em branco sintaticamente significativos porque acreditam (ou pelo menos pensam que seus usuários em potencial acreditam) que os pontos e vírgulas e os aparelhos acrescentam ruído ao ler código, prejudicando a produtividade. Outro motivo comum é que o estilo de codificação ruim / inconsistente prejudica a legibilidade - forçando um esquema de indentação comum, a linguagem tem melhor legibilidade em geral. Esse motivo posterior é menos importante agora que IDEs de formatação automática são mais comuns, mas ainda podem ser aplicados.
fonte