我发现 ANSI Smalltalk 规范(草案)中没有提及thisContext
。
我认为 ANSI Smalltalk 是标准化的 Smalltalk-80,所以我不明白为什么它不存在。他们有什么区别?
Smalltalk-80 指的是一个非常具体的东西:1980 年在 Xerox Parc 使用的 Smalltalk 版本。虽然有许多基于 Smalltalks,无论是直接意义上的(Squeak 和 Pharo)还是意识形态意义上的(Ambrai Smalltalk 和 GNU Smalltalk),在那个环境下,今天没有任何 Smalltalks 实际上完全遵守那本书中描述的语言和虚拟机。甚至可能是意识形态上最接近的 Squeak 也存在一些重大偏差:Squeak 有闭包,Smalltalk-80 没有;Squeak 有 Unicode,Smalltalk-80 没有;Squeak 的 VM 支持和使用命名原语,Smalltalk-80 不支持;Squeak 支持一些 Smalltalk-80 不支持的字节码;等等。
ANSI Smalltalk 与 ANSI Common Lisp 类似,试图定义一个标准,将 Smalltalk 功能的公共子集整合到主要的 Smalltalk 实现中。由于 ANSI 标准是在 1998 年编写的,它所考虑的远不止最初的实现。特别是,当时一些主要的 Smalltalk,例如 Smalltalk MT 和 VisualAge Smalltalk,完全缺乏延续(因此是一个thisContext
变量)。因此,ANSI 标准中没有该功能。
在实践中,这些差异在一定程度上是学术性的。你很担心thisContext
,但 GNU Smalltalk 有完全不同的语法,VisualWorks 有命名空间,Squeak 有 Traits,Pharo 缺乏 MVC ......还有更紧迫的区别。Smalltalk-80 和 ANSI Smalltalk 草案在 Smalltalk 生命的这一点上都比其他任何东西都更具指导性。