我在另一个博客近期一篇博文中说了一个轶闻,是关于Robert Dewar的妻子如何发明Python缩进的趣事。当时我就提到自己并不十分确认具体细节,现在看来此举颇为明智,因为真相与之颇有偏差。我收到了Lambert Meertens一封详述此事的长电子邮件。我准备在此复述此信,除了部分他要求不要直接引用的部分外基本是信的全部内容了。摘要:Karin Dewar提供了ABC(因为也是Python)中在缩进开始前使用冒号的灵感,而不是缩进本身。下面是Lambert的电子邮件:
Dewar的贡献不在缩进本身,而是发明了缩进前冒号的使用。
首先是B中的缩进。在B0(B0,B1,B2, ... 是创建ABC时的一系列设计,B0最早)中就采用了强制缩进来分组代码,并且把分组代码用BEGIN和ENG分隔符包含起来。关于这点可以参考[GM76]的4.1节(布局)。如同打印美观一样,缩进被提议由专门的B编辑器来负责,而用户无法对此修改:用户没有被赋予取消这一设置的选择,以免缩进的强制性被破坏。
有了强制性缩进后,额外的BEGIN和END分隔符自然就显得多余了,B1时我们就取消了BEGIN,只保留了END IF、END FOR等结束分隔符,在B2时结束分隔符也被取消了,只利用缩进作为分组代码的唯一标识。这一点可参考[ME81]第四章(语句语法)
ABC中缩进的本意仅是为了使源代码看起来整洁,易于表达语义逻辑,把尚未强制的习俗固化下来,取消额外的BEGIN ... END可能受[PL75]影响,后者提倡仅用缩进来分组代码。occam出现(1983)的要晚,因此缩进这一特性不可能源自occam,同一原因,也不会是借鉴自Miranda(1985)。据我所知,B语言是最早采用缩进作为分组语句特性的且正式发布(并且有实现)的语言
现在到了 Dewar 的故事,也就是我得知采用冒号的由来,我在此将其记录下来,也算是ABC设计理念的回忆录:
依 Lambert 要求,下面的内容由我组织语句而不是直接引用。
1978年,一次在Jablonna(亚布翁纳)召开的设计会议上,Robert Dewar, Peter King, Jack Schwartz 和 Lambert比较各种为B提议的语法,通过比较采用各种语法实现同样的(代码质量一般的)冒泡排序。他们僵持不下时便去Robert Dewar妻子的房间将她喊来,想听听她的观点,像是现代版的让Paris来从Hera, Athena, 和 Aphrodite之间选美。但是刚刚向她解说了第一个语法形式后,她说道:“你的意思是说,这样一行'FOR i ...',必然会影响接下来的一组语句,而不会仅是影响当前行本身?!”于是,这些科学家们意识到在这样的行结束后附加一个冒号,就能避免误解。
Lambert 还提到如下相关文献:
[PL75] P. J. Plauger. Signal and noise in programming language. In J. D. White, editor, Proc. ACM Annual Conference 1975, page 216. ACM, 1975.
[GM76] Leo Geurts and Lambert Meertens. Designing a beginners' programming language. In S.A. Schuman, editor, New Directions in Algorithmic Languages 1975, pages 1–18. IRIA, Rocquencourt, 1976.
[ME81] Lambert Meertens. Issues in the design of a beginners' programming language. In J.W. de Bakker and J.C. van Vliet, editors, Algorithmic Languages, pages 167–184. North-Holland Publishing Company, Amsterdam, 1981.
############################################################################
小广告:以前留言的朋友,由于博客的缺省设置,可能将部分留言作为广告信息自动屏蔽了,所以我当时没有看到留言,十分抱歉。现在修改了设置,应当能看到了。