打开网易新闻 查看精彩图片

2023年,GitHub上一个叫「seed」的仓库悄悄更新了8次提交。没人注意到,这个8星项目正在把一门死了13年的编程语言,塞进当今最快的Scheme实现里。

这事得从2009年说起。

那年John Nathan Shutt发布了Kernel语言的最终规范。他把Lisp社区70年的宏系统争议,用一个叫vau的操作符一次性解决了。宏和函数,从此是同一个东西。2010年他写完博士论文,2020年去世。这门语言跟着进了冷冻舱。

vau这个点子没死。它像某种思想病毒,在Lisp圈子里缓慢传播。MIT Scheme有了一级环境,Guile跟进了,Gambit做了变形版,连Chez Scheme都加了「continuation附件」——Kernel里「键控动态变量」的远房亲戚。

amirouche在seed项目的README里写得很直白:「我试过放下Kernel,但它回来了,像Python、JavaScript、PHP那样,只是没有它们的优雅或态度。」

为什么非得是Chez Scheme

为什么非得是Chez Scheme

Chez Scheme现在是工业级Scheme的事实标准。Racket用它做后端,Cisco养着核心团队,编译速度能把其他实现甩出数量级。

但Chez有个历史包袱:它的宏系统是传统syntax-case。这意味着宏在编译期跑,和用户代码活在不同的时空。Kernel的vau反着来——宏就是普通函数,运行时和操作数直接见面。

amirouche的选择很刁钻:不碰Chez的编译器,只动运行时。他用「不可变动态环境」这个设计,把vau嫁接进去。换句话说,宏调用时拿到的是环境的快照,不是真去篡改编译器的符号表。

打开网易新闻 查看精彩图片

这个妥协让Kernel的语义完整保留,同时蹭上Chez的JIT和优化器。seed仓库的代码量很小,核心就几页Scheme。但每一行都在回答同一个问题:如果1958年的Lisp精神活到2023年,该长什么样?

vau到底解决了什么

vau到底解决了什么

传统Lisp宏的问题,用过的人都知道。Common Lisp的defmacro编译期展开,错一个括号,报错信息来自火星。Scheme的syntax-rulessyntax-case加了卫生机制,但学习曲线像一堵墙。

Marc Nieper-Wißkirchen写过一本《Extending a Language》,把syntax-case的用法榨干了。amirouche承认这书「 excellent work」,但补了一句:「我不买账。」

Kernel的答案是懒。不是计算惰性,是概念惰性。vau让宏和函数共享同一套抽象,你不用先学「这是宏的特殊语法」,再学「这是函数的正常语法」。只有一个语法:求值规则由你定。

seed项目目前的状态是「能跑」。8次提交,0个fork,README比代码长。但amirouche在issue区很活跃,回复每个提问者,解释设计取舍。这种姿态很Kernel——不是推产品,是播种子。

70年 lineage 的又一次分叉

70年 lineage 的又一次分叉

seed的README里埋了一条时间线:1958年Lisp诞生,1975年Scheme分叉,1982年Brian Cantwell Smith的3-Lisp论文给vau铺了理论地基,2009年Kernel定型,2023年seed试图把它焊进Chez。

中间漏掉的细节更多。Femtolisp进了Julia的parser,Clojure的edn把S表达式卖给主流用户,Fennel在游戏开发圈找到地盘。这些项目的共同点是:都相信一个小而可编程的核心值得押注。

打开网易新闻 查看精彩图片

Kernel的vau是这条线上的下一个赌注。它赌的是:宏系统不需要两套语法,不需要编译期和运行期的割裂,不需要让用户背「卫生宏」的概念债。

amirouche在2023年的提交记录里,有一次把LICENSE从GPL换成了MIT。另一次加了.gitignore,排除了Chez的编译中间文件。最实质性的一次改动是引入了「不可变环境」的持久化数据结构——这是让vau在Chez里不翻车的基础设施。

谁会在乎一个8星项目

谁会在乎一个8星项目

直接用户可能很少。但seed的存在本身是个信号:Chez Scheme的开放度比表面看起来高。它的C接口足够干净,让第三方能塞进全新的求值语义,而不需要fork整个编译器。

这对Racket社区尤其有意思。Racket正在经历一场「Chez化」迁移,核心从C实现的Racket VM切到Chez Scheme。如果seed的路走通了,Racket用户理论上能直接调用Kernel风格的宏,而不等官方支持。

更远的想象是Julia。它的parser已经是Femtolisp,但宏系统还是Julia原生的。如果哪天Julia团队想升级,seed在Chez上的实验会是一份现成的参考实现。

amirouche没提这些。他的README停在一句自我重复:「也许是精英主义,也许是智力好奇,也许是部落主义。也许是那些括号。」

2024年初,seed仓库最后一次更新是调整README的格式。8个star,0个watch,issue区安静了。但GitHub的依赖图谱显示,有3个私有仓库引用了它——都是Scheme相关的语言实验。

如果Kernel的vau真的能在Chez里跑顺,第一个大规模受益者会是谁?Racket的迁移工程,还是某个还没诞生的新语言?