吉多·冯·罗苏姆(Guido Von Rossum)
从与吉多·范罗苏姆接受记者采访时,可在全文中可以看出与books.google.com(重点煤矿):
选择缩进进行分组在Python中并不是一个新颖的概念。我是从ABC继承过来的,但是它也发生在较旧的语言occam中。我不知道ABC的作者是从occam那里得到这个想法,还是独立发明了它,或者是否有一个共同的祖先。当然,我可以选择不遵循ABC的领导,就像我在其他领域所做的那样(例如,ABC使用大写字母表示语言关键字和过程名称,我没有复制过这个想法),但是我相当喜欢此功能在使用ABC时花了一点时间,因为它似乎消除了当时C用户之间关于在何处放置花括号的某种毫无意义的争论。
冯·罗苏姆(Von Rossum)受ABC的极大启发,尽管他不必复制所有内容,但缩进的使用得以保留,因为它可以避免宗教战争。
我也很清楚,可读代码无论如何都自愿使用缩进来表示分组,并且在代码中我遇到了一些细微的错误,即缩进与使用花括号的句法分组不一致 -程序员和任何审阅者都认为缩进与分组匹配因此没有注意到该错误。同样,一个漫长的调试会议也教了宝贵的一课。
Rossum还目睹了由于分组和缩进之间的不一致而导致的错误,并且显然,尽管仅依靠缩进来构造代码会更安全,从而避免编程错误1。
Donald E. Knuth和Peter J.Landin
在引用的采访中,Guido提到了Don Knuth使用缩进的想法。这在详细的克努特缩进报价重新发现,它的报价结构化程序设计与GOTO语句。Knuth还引用了Peter John Landin的“下700种编程语言”(请参阅有关缩进的“讨论”部分)。Landin设计的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中缩进关闭的中间代码根本无法通过master分支来完成,所有适当的样式检查都会使GCC / Jenkins对我大叫。最近,我遇到了一个与上面在Python中描述的问题类似的问题,只是缩进了一层。有时候,我用C语言编写的代码超出了括号的范围,但是后来我打了Tab键,代码缩进了“错误地”:那是再一次看到bug的机会。
let x =1; y = 2; z = 3
是完全有效的do { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
。那些不必在同一行。