把仍在改动的语言公开

公历2008年1月29日,保罗·格雷厄姆宣布公开Arc的一个版本,并启用语言讨论网站。Arc是他与罗伯特·莫里斯参与开发的Lisp方言,早期代码的版权声明列出二人姓名。发布时,格雷厄姆没有把它描述成已经定型的标准:这只是从正在使用的代码中取出的一个快照,仍有临时处理和留给开发者自己的修改备注。

他希望让程序员尽早使用,并继续根据实际程序调整语言。发布声明把这种方法称为探索式编程:编写者尚未完全确定程序和数据最终应当怎样组织,因此语言要容许不断试写、改写。缩短重复的表达,比先把所有规则固定下来更重要。

参考:[1] [4]

从早期设计到新闻网站

在2001年11月的LL1会议讲稿中,格雷厄姆已公开介绍尚很年轻的Arc。他把目标放在熟悉编程的人身上,希望保留Lisp可扩充的特点,同时重新检查那些仅因习惯而沿用的形式。例如,把表示匿名函数的lambda改写为较短的fn,便是他试用后保留的选择。

这份讲稿还提出,语言应当与一个较大的应用共同设计,以便在使用中检验取舍。据他2021年的回忆,2006年夏,他和莫里斯开始开发一个编译到Scheme的新实现;为试用它,他写了新闻聚合网站Startup News,后来改名为Hacker News。到2008年公开Arc时,新开的语言论坛已经大量复用了Hacker News的代码。

参考:[1] [2] [3]

用小核心和宏搭起语言

公开版本依托MzScheme运行。早期代码中,as.scm加载编译器,再装入Arc本身的库;ac.scm把Arc表达式转换为Scheme表达式,其中普通参数形式的fn直接转换为lambda。使用者输入的Arc代码由这一转换层交给Scheme求值,语言不必从机器指令和全部运行设施重新做起。

许多日常写法则在Arc内部定义。arc.arc把函数定义def和宏定义mac逐层建立起来,又把with、let这类局部变量绑定写成宏。宏先把一种表达形式展开成另一种,让常用的简写能够由语言自己的代码表达。方括号也有明确用途:brackets.scm把其中的表达式读成单参数函数,以底线符号表示该参数。

参考:[4]

反复改写实际程序

格雷厄姆在发布后的技术说明中交代了工作方法:先写应用,再逐行寻找可以缩短的表达,增加相应语言功能,重写应用,然后重复这一过程。他以Hacker News源文件里留下的代码树计数为例;数值有时下降,有时因增加网站功能而上升。

这里衡量的不是把变量名称缩成一个字母,也不是把多行挤在一行。代码树把程序看作由词项和嵌套表达式组成的结构,计数关注需要表达多少内容。这是开发者用来比较方案的尺度;他主要关心真实应用能否简化,而不是只让编译器本身变短。

参考:[1] [5]

一个跨越三页的表单

2008年2月,格雷厄姆提出一个具体练习:第一页有输入框和提交按钮,提交后第二页显示“click here”链接,点击后第三页回显最初输入的文字。附加要求是,输入值不能直接放进网址,否则读者修改网址就能改变最后的显示内容。

他的示例用defop命名页面操作,以aform建立表单,input和submit生成输入框与按钮。表单提交后,方括号中的函数取得请求;w/link生成下一页的链接,并把回显动作与这次请求联系起来。早期服务器库把函数存入表中,以生成的标识符建立链接,之后再找到对应函数执行。因此,下一次点击仍能使用先前提交的内容,而无需把那段文字作为链接参数传递。

原示例共计23个代码树节点,包括15个叶节点和8个内部节点。这个小程序把输入、提交和后续点击连接在同一段嵌套表达式中,展示了Arc把网页操作与函数组合起来的写法。格雷厄姆据此邀请其他语言的使用者提交实现,比较具体程序的长度。

参考:[4] [5]

公开版本保留的取舍

这套工具也带着明确限制。发布声明说当时Arc只支持ASCII字符;格雷厄姆知道MzScheme有更丰富的字符处理能力,却选择暂不花时间把它接入。对需要多种文字的应用而言,这直接限制了可用范围。

他同时预告,开发者仍会调整语言,不承诺为已有程序维持兼容,也不会逐项记录所有变动。公开代码因而既提供了可以检查和试写的实现,也要求早期采用者承担随语言变化而修改程序的成本。2008年的这次发布,把此前设计讨论和网站实践带到了更广泛的试用者面前。

参考:[1]