femtolisp:轻量级、稳健、类Scheme的Lisp实现
Source: Hacker News
…a purely symbolic gesture…
这个项目始于尝试在不到 1,000 行 C 代码的情况下编写最快的 Lisp 解释器。随后我不断尝试在极少的代码量下加入强大的功能,项目逐渐壮大。与此同时,我收集了一些我和其他人最喜欢的 C 代码,作为标准库的基础。其中包括 ios,它是对 C 标准库 stdio 部分功能的替代实现,提供了更灵活的特性。
在你说“又一个 Lisp”之前,请先了解以下内容:femtolisp 大约 150 KB,高度自包含,具备以下特性:
- 向量、字符串、gensym
- 反引号(backquote)
- 异常处理
- 循环/共享结构的打印与读取
- 所有值都可以可读地打印
- 美化打印(pretty‑printing)
- 哈希表
- 支持像 Python
ctypes那样直接使用 C 数据类型 - 在循环结构上工作的
equal与有序比较谓词 - 正确的尾递归
- 支持 UTF‑8 的 I/O 与内存流
- 与 Scheme 高度兼容,包括部分 R6RS 特性
- 简单、组织良好且功能强大的 API,函数数量尽可能少
- 紧凑型垃圾回收(compacting GC)
…and it is fast, ranking among the fastest non‑native‑compiled Scheme implementations. It achieves this level of speed even though many primitives (e.g. filter and for‑each) are written in the language instead of C. femtolisp uses a bytecode compiler and VM, with the compiler written in femtolisp. Bytecode is first‑class, can be printed and read, and is “human readable” (the representation is a string of normal low‑ASCII characters).
femtolisp 是一种简洁、优雅的 Scheme 方言。它是一个带词法作用域的 Lisp‑1。核心包括 12 个内建特殊形式和 33 个内建函数。
Design Goals
- 简洁性(Conciseness):每个概念只在一个地方实现,使系统易于理解和修改。错误出现的地点越少,可靠性就越高。参见
torture.scm,其中展示了一小套通用且非常好用的特性。 - 正确性(Correctness):许多 Lisp 实现会省略一些晦涩但关键的特性,例如
#.读取宏、回溯引用、gensym、以及正确转义的符号名。如果你要再造一个 Lisp,至少要把它做好。 - 稳定性(Stability):避免无意义的新奇特性。一些“闪亮的新”方言会随意更改语法(例如去掉反引号、修改
quote、禁止点对列表),这会在没有实际好处的情况下破坏兼容性。 - 性能(Performance):正确的尾递归常被误认为会降低速度。
tiny子目录或interpreter分支展示了一个纯 s‑expr 解释器,具备高效的正确尾调用,在保持词法作用域的同时仍然难以被速度超越。
Implementation Notes
- 该项目在很大程度上是一种风格的体现。阅读代码即可体会其背后的哲学。
- 这项工作纯粹是为了乐趣,是商业语言实现的完全相反——一个许多人认为“不受欢迎”的编程语言的晦涩实现。