Guido Von Rossum
De una entrevista con Guido Van Rossum , que se puede ver en texto completo con books.google.com (el énfasis es mío):
La elección de la sangría para la agrupación no era un concepto novedoso en Python; Heredé esto de ABC , pero también ocurrió en occam, un idioma antiguo. No sé si los autores de ABC tuvieron la idea de occam, o si la inventaron de forma independiente, o si hubo un antepasado común. Por supuesto, podría haber optado por no seguir el ejemplo de ABC, como lo hice en otras áreas (por ejemplo, ABC usó mayúsculas para palabras clave de lenguaje y nombres de procedimientos, una idea que no copié), pero me gustó bastante la función mientras usaba ABC, ya que parecía eliminar un cierto tipo de debate inútil común entre los usuarios de C en ese momento, sobre dónde colocar las llaves .
Von Rossum se inspiró fuertemente en ABC , y aunque no tuvo que copiarlo todo, se mantuvo el uso de la sangría porque podría ser beneficioso para evitar guerras religiosas.
También sabía que el código legible usa la sangría voluntariamente de todos modos para indicar la agrupación, y me encontré con sutiles errores en el código donde la sangría no estaba de acuerdo con la agrupación sintáctica utilizando llaves, el programador y los revisores asumieron que la sangría coincidía con la agrupación y por lo tanto no noté el error. Una vez más, una larga sesión de depuración enseñó una valiosa lección.
Rossum también fue testigo de errores debido a la inconsistencia entre la agrupación y la sangría, y aparentemente aunque confiar en la sangría solo para estructurar el código sería más seguro contra los errores de programación 1 .
Donald E. Knuth y Peter J. Landin
En la entrevista a la que se hace referencia, Guido menciona la idea de Don Knuth de usar sangría. Esto se detalla en La cita de sangría de Knuth redescubierta , que cita la Programación estructurada con declaraciones Goto . Knuth también hace referencia a Los siguientes 700 lenguajes de programación de Peter John Landin (consulte la sección Discusión sobre sangría). Landin diseñó ISWIM que parece el primer idioma con sangría en lugar de bloques de inicio / finalización. Esos documentos tratan más sobre la viabilidad de usar sangría para estructurar programas en lugar de argumentos reales a favor de hacerlo.
1. Creo que este es, de hecho, un argumento a favor de tener construcciones de agrupación y formateo automático, para detectar y recuperarse de los errores de programación, que seguramente sucederán. Si arruinas tu sangría en Python, la persona que depura tu código tendrá que adivinar cuál es la correcta:
if (test(x)):
foo(x)
bar(x)
¿ barSiempre se llamará o solo si la prueba tiene éxito?
Las construcciones de agrupamiento agregan un nivel de redundancia que lo ayuda a detectar un error cuando sangra automáticamente su código. En C, el código equivalente se puede sangrar automáticamente de la siguiente manera:
if (test(x))
foo(x);
bar(x);
Si tenía la intención de barestar al mismo nivel que foo, la sangría automática basada en la estructura del código me permite ver que hay algo mal que se puede solucionar agregando llaves alrededor fooy bar.
En Python: Mitos sobre la sangría , hay un ejemplo supuestamente malo de C:
/* Warning: bogus C code! */
if (some condition)
if (another condition)
do_something(fancy);
else
this_sucks(badluck);
Ese es el mismo caso que el anterior, en Emacs, resalto todo el bloque / función, presiono Tab y luego todo el código se reinventa. La discrepancia entre la sangría humana y la estructura del código me dice que algo está mal (¡eso y el comentario anterior!).
Además, el código intermedio donde la sangría está desactivada en C simplemente no pasa a través de la rama maestra, todas las comprobaciones de estilo en su lugar harían que GCC / Jenkins me gritaran. Recientemente tuve un problema similar al descrito anteriormente en Python, con una declaración desactivada por un nivel de sangría. A veces tengo un código en C que va más allá de una llave de cierre, pero luego presiono Tab y el código sangra "incorrectamente": esa es una oportunidad más para ver el error.
let x =1; y = 2; z = 3es completamente válido, como esdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }. Esos no necesitan estar en la misma línea.