课堂中的开发起点
1995年1月,Matthias Felleisen在休斯敦的莱斯大学推动一项计划:让函数式编程服务于学校的代数和程序设计教学。参与讨论的研究者包括Shriram Krishnamurthi、Cormac Flanagan和Matthew Flatt。Felleisen与Bruce Duba考虑课程及语言设计。创建者2020年的回忆把讨论定位于1月下旬,但对第一次敲下代码的确切日期保留了不确定性。
参考:[1]
先做可用的图形环境
Flatt后来解释,最初的图形系统来自1995年把Scheme解释器与可移植图形库接合的选择。图形代码采用C++,并在以后长期保留:解释器速度和外部函数接口当时还不够适合把这部分全部改写为Scheme。这种分工把交互环境的实现条件纳入了语言工程,并非只规定一套纸面语法。
据创建者回忆,Flatt选择wxWindows和易于嵌入的libscheme,先制成MrEd;随后把修改过的解释器独立为MzScheme。1995年夏季的教师工作坊试用过基于MrEd的简陋环境,使用效果仍不理想。
1995年的版本记录
项目保留的语言历史日志从1995年9月26日的0.27版开始,该条目还说明这次创建了日志文件。因此,这个日期能够证实具体版本的存在,却不是整个项目首次公开发布的充分证明。记录显示,这次修改了命令行选项,加入脚本运行选项,整理栈溢出检查,并把若干语法形式重新实现为宏。
同年10月25日的0.30版加入多值调用与正则表达式设施;12月21日的0.33版记载有理数和复数支持,12月30日的0.34版继续改进大整数运算。这些逐次修订说明,早期实现处于持续补充和纠错之中。
参考:[3]
用列表长度解释设计
1997年的DrScheme论文已描述一个公开可取得的教学环境,并报告莱斯大学入门课程在辅导和作业中每周使用它。论文用列表长度程序说明学生的困难:空表长度是零,非空表的长度应是余表长度加一。学生若把递归分支写成“1 + (length (cdr l))”,便把熟悉的中缀加法带进了Scheme。
这种写法在普通Scheme中可能合法,但条件分支只返回最后一个表达式的值,加法没有真正发生,结果总是零。例如,对一个含有三项的列表,正确答案是三;错误分支却逐层递归到空表并把零传回来,遗漏了每一层本应加上的一。正确的运算形式应为“(+ 1 (length (cdr l)))”。DrScheme因而设置从初学到较完整Scheme的语言层级,以严格的语法检查提早指出这类错误。这是1997年论文展示的教学设计,不是1995年初版已具备全部工具的声明。
参考:[4]
从教学工具到实现平台
1998年,莱斯大学编程语言团队(Programming Languages Team,PLT)的项目综述把DrScheme描述为编辑与求值紧密结合的环境。每次执行当前程序时,交互窗口使用新的命名空间,避免旧定义残留而掩盖错误;运行中发生安全检查失败时,环境标出相应源代码位置。Flanagan负责MrSpidey静态调试器,Stephanie Weirich曾制作其早期原型。交互窗口输出的表示方法也应配合语言层级:初学者先看到便于代数理解的形式;学到数据修改之后,再显示数据内部共享的关系。
为了构造这种图形应用,团队继续改进MzScheme与MrEd,加入对象系统、异常机制和程序单元组织能力。MrEd把图形类与对象、线程系统结合,让环境自身和用户编写的图形程序能够共存。综述报告,团队把静态分析工具用于DrScheme自身一部分代码;这既发现了问题,也暴露了分析大型程序所需的计算资源负担。
参考:[5]
后来的Racket名称
2010年6月的5.0版公告以Racket为名称宣布发行,并明确说明它原名PLT Scheme,已有超过十五年的开发经历。这一更名承接了既有软件和用户群体。
参考:[6]