探索 alisp 1.6:Common Lisp 实现的新里程碑

Lisp 实现的格局常被长期存在的巨头所主导,但 alisp 1.6 的出现表明,实现 Common Lisp 标准的动力依然十分旺盛。该项目由 Andrea Monaco 开发并托管在 Savannah,alisp 旨在提供一个强大的 Common Lisp 实现,能够加载真实世界的系统,包括关键的 ASDF(Another System Definition Facility)。

版本 1.6 标志着项目成熟度的显著提升,重点在于完善核心数据结构、扩展标准库以及修复对象系统中的关键错误。此更新凸显了语言实现的迭代特性,即架构重构常常在即时功能与长期稳定性之间进行权衡。

版本 1.6 的关键技术更新

重新设计专用数组

此版本最具影响力的变化之一是对专用数组的全面重新设计。在 alisp 1.6 中,字符串和位向量现在被视为字节数组的实例。此架构转变旨在为未来针对不同大小整数的专用数组铺平道路。

然而,这一重新设计带来了暂时的回退:由于字符串现在基于字节,Unicode 支持目前不可用。开发者指出,Unicode 支持将在未来的版本中恢复,并通过不同的机制实现。

加强对象系统(CLOS)

Common Lisp 对象系统(CLOS)是标准中最复杂的部分之一。版本 1.6 解决了若干关键领域:

  • Structure Slots: 现在支持结构槽的初始化形式,允许更灵活的对象创建。
  • DEFCLASS Bug Fixes: 解决了 Lisp 实现的 DEFCLASS 中的一个错误。之前,访问器方法在定义时缺少类型特化器,导致当不同类共享相同访问器名称但对应不同字段时出现细微错误。这对高度依赖这些模式的 ASDF 尤为棘手。
  • Generic Functions: 实现现在包含 SLOT-MISSINGSLOT-UNBOUND 泛型函数,提升了对象系统中的错误处理和自省能力。

标准库和语言扩展

此版本填补了 Common Lisp 标准中若干缺失的部分:

  • Package Management: DEFPACKAGE 现在支持 :SHADOWING-IMPORT-FROM 选项,使包系统更接近完整规范的合规性。
  • MAKE-SEQUENCE: 已添加此用于创建列表和向量的关键函数。
  • Integer Operations: 现在提供 INTEGER-LENGTHLOGCOUNT,用于位运算和数值分析。
  • Core Logic Migration: LAMBDAIN-PACKAGE 已从核心引擎迁移至 Lisp 代码,可能简化了维护者对这些特性的迭代工作。
  • Property List Fixes: 已修复之前损坏的 (SETF GETF),并新增了 (SETF GET)

社区观点与未解问题

虽然此发布是一次技术成就,社区仍在探讨项目的长期目标和架构。一位 Hacker News 用户提出了关于项目结构及其竞争定位的问题:

我想知道你们如何在这个庞大的 all-in-one main.c 中跟踪所有内容。你们计划实现 100% 吗?是否有一份实际缺失的功能列表以及哪些相关项目依赖这些缺失部分?与例如 ECL 或 CLISP 相比,核心优势是什么?

这些问题涉及任何新 Lisp 实现的核心挑战:在简洁的单体代码库与可扩展的模块化架构之间的平衡,以及相较于诸如 ECL(Embeddable Common Lisp)或 CLISP 等成熟实现的价值主张。

结论

alisp 1.6 不仅仅是一次版本升级;它是对语言内部表示的精炼,并推动了与 Common Lisp 生态系统更广泛的兼容性。通过成功加载 ASDF 并解决 DEFCLASS 的细微问题,alisp 正将自己定位为对 Lisp 实现内部感兴趣或寻求标准新视角的用户的可行、轻量级替代方案。

Sources