Hoot 0.10.0 released

本文为原文前 6,000 字符的节选翻译,完整内容请查看原文。

Hoot 0.10.0 released! Dave Thompson — October 28, 2026. We are excited to announce the release of Hoot 0.10.0! Hoot is a Scheme to WebAssembly compiler backend for Guile, as well as a general purpose WebAssembly toolchain. In other words, Scheme in the browser! This release contains new features and bug fixes and since the 0.9.0 release back in May.

Hoot 0.10.0 发布!Dave Thompson — 2026 年 10 月 28 日。我们很高兴地宣布 Hoot 0.10.0 发布!Hoot 是一个用于 Guile 的 Scheme 到 WebAssembly 编译器后端,也是一个通用的 WebAssembly 工具链。换句话说,就是浏览器里的 Scheme!此版本包含了自 5 月份 0.9.0 版本发布以来的新功能和错误修复。

Use Hoot in the upcoming Lisp Game Jam! On Friday (October 30th 2026), the autumn edition of the Lisp Game Jam will begin! It’s a 10-day long game jam where participants make games using their favorite flavor of Lisp. Does making a small web game in Scheme using Hoot sound appealing to you? Well, then we have just the thing to get you started: the Hoot game jam template!

在即将到来的 Lisp 游戏开发马拉松(Lisp Game Jam)中使用 Hoot 吧!周五(2026 年 10 月 30 日),秋季版 Lisp Game Jam 即将开始!这是一个为期 10 天的游戏开发活动,参与者将使用他们最喜欢的 Lisp 方言制作游戏。用 Hoot 通过 Scheme 制作一个小型的网页游戏听起来吸引人吗?那么,我们正好有让你入门的东西:Hoot 游戏开发模板!

This template project has everything you need to start making an HTML5 game with Hoot quickly. The template repository includes: Bindings to the necessary web APIs to make an interactive game with HTML5 canvas; A Makefile for compiling, running a development web server, and generating a .zip bundle for uploading to itch.io; A very simple Breakout-like example game that demonstrates how to put all the pieces together. For more inspiration, here are some games made with Hoot for past jams: Cirkoban, Strigoform, Shields, TYVM.

这个模板项目包含了你快速开始使用 Hoot 制作 HTML5 游戏所需的一切。模板仓库包括:用于制作 HTML5 画布交互式游戏的必要 Web API 绑定;一个用于编译、运行开发 Web 服务器以及生成用于上传到 itch.io 的 .zip 包的 Makefile;一个非常简单的类似打砖块(Breakout)的示例游戏,演示了如何将所有部分组合在一起。为了获得更多灵感,这里有一些在过去活动中用 Hoot 制作的游戏:Cirkoban、Strigoform、Shields、TYVM。

Now, onto the release notes! Compiler changes: Added module name to contextualize duplicate import errors. Added support for library versioning for R6RS compatibility. Fixed default version for define-module libraries. Fixed locate-library not respecting configured load extensions. Previously, we were using Guile’s load extension parameter instead of Hoot’s own.

现在,进入发布说明!编译器更改:添加了模块名称以使重复导入错误更具上下文。添加了对 R6RS 兼容性的库版本控制支持。修复了 define-module 库的默认版本。修复了 locate-library 不遵守已配置加载扩展的问题。此前,我们使用的是 Guile 的加载扩展参数,而不是 Hoot 自己的。

Runtime changes: Added %struct-ref and %struct-set! primitives for accessing record types defined using the interpreter. Stopped raising errors when importing an undefined symbol in the runtime module system. Guile is lax about this so Hoot being strict caused compatibility issues. Fixed optional argument parsing in primitive-eval. Fixed keyword argument parsing for procedures with both optional and keyword arguments in primitive-eval. Fixed error messages regarding runtime module registry to include the correct CLI flag: -fruntime-modules.

运行时更改:添加了 %struct-ref 和 %struct-set! 原语,用于访问使用解释器定义的记录类型。停止在运行时模块系统中导入未定义符号时引发错误。Guile 对此比较宽松,因此 Hoot 的严格要求导致了兼容性问题。修复了 primitive-eval 中的可选参数解析。修复了 primitive-eval 中同时具有可选参数和关键字参数的过程的关键字参数解析。修复了有关运行时模块注册表的错误消息,使其包含正确的 CLI 标志:-fruntime-modules。

Scheme changes: Added partial implementation of SRFI-13: String Libraries. It’s just a set of re-exports, very similar to Guile, but Guile’s SRFI-13 module is not declarative and is thus rejected by Hoot’s compiler. Added partial implementation of SRFI-60: Integers as Bits. Added define-macro, defmacro, delete, list->symbol, and symbol to (guile). Exported define-syntax-parameter and syntax-parameterize, symbol-append, integer-length, and gensym from (guile). Added list->bitvector and bitvector to (hoot bitvectors) and re-exported them in (guile).

Scheme 更改:添加了 SRFI-13:字符串库的部分实现。这只是一组重新导出,与 Guile 非常相似,但 Guile 的 SRFI-13 模块不是声明式的,因此被 Hoot 的编译器拒绝。添加了 SRFI-60:位整数的部分实现。向 (guile) 添加了 define-macro、defmacro、delete、list->symbol 和 symbol。从 (guile) 导出了 define-syntax-parameter 和 syntax-parameterize、symbol-append、integer-length 和 gensym。向 (hoot bitvectors) 添加了 list->bitvector 和 bitvector,并在 (guile) 中重新导出了它们。

Implemented get-bytevector-all in (rnrs io ports). Made bytevector=? a publicly exported procedure from (hoot bytevectors) and (rnrs bytevectors). Added define-syntax-parameter and syntax-parameterize primitives. Improved (ice-9 exceptions) exports to more closely match Guile. Added (rnrs) module. Added (rnrs base) module. Added (rnrs syntax-case) module. Added (rnrs r5rs) module. Added (rnrs hashtables) module. Added (rnrs files) module. Added (rnrs enums) module. Added (rnrs exceptions) module. Added (rnrs arithmetic fixnums) module. Added (rnrs records inspection) module. Added (rnrs records procedural) module. Added (rnrs records syntactic) module. Added (rnrs io simple) module. Added (rnrs io ports) module.

在 (rnrs io ports) 中实现了 get-bytevector-all。使 bytevector=? 成为从 (hoot bytevectors) 和 (rnrs bytevectors) 公开导出的过程。添加了 define-syntax-parameter 和 syntax-parameterize 原语。改进了 (ice-9 exceptions) 导出,使其更接近 Guile。添加了 (rnrs) 模块。添加了 (rnrs base) 模块。添加了 (rnrs syntax-case) 模块。添加了 (rnrs r5rs) 模块。添加了 (rnrs hashtables) 模块。添加了 (rnrs files) 模块。添加了 (rnrs enums) 模块。添加了 (rnrs exceptions) 模块。添加了 (rnrs arithmetic fixnums) 模块。添加了 (rnrs records inspection) 模块。添加了 (rnrs records procedural) 模块。添加了 (rnrs records syntactic) 模块。添加了 (rnrs io simple) 模块。添加了 (rnrs io ports) 模块。

Added port-has-position? to (hoot ports) for R6RS compatibility. Added stubs for centered division to (hoot numbers) and a stub for integer-length to (hoot bitwise) for R6RS compatibility (eventually). Rewrote (rnrs bytevectors) as an R6RS module with version (6). Fixed number->string to round floating point decimal part to an even digit. Fixed number->string for floating point numbers ±2^N, where 52 <= N <= 1023. Fixed incorrect bytevector copy in number->string floating point conversion algorithm. Fixed min/max macros not working when given zero arguments. Fixed the parameters to the log procedure in (guile). Fixed the implementation of negate in guile. It was doing entirely the wrong thing.

为 R6RS 兼容性向 (hoot ports) 添加了 port-has-position?。为 R6RS 兼容性(最终)向 (hoot numbers) 添加了中心除法的存根,并向 (hoot bitwise) 添加了 integer-length 的存根。将 (rnrs bytevectors) 重写为版本为 (6) 的 R6RS 模块。修复了 number->string 将浮点小数部分舍入到偶数位的问题。修复了 52 <= N <= 1023 的浮点数 ±2^N 的 number->string 问题。修复了 number->string 浮点转换算法中不正确的字节向量复制问题。修复了 min/max 宏在给定零个参数时不工作的问题。修复了 (guile) 中 log 过程的参数。修复了 guile 中 negate 的实现。它之前完全做错了。

CLI changes: Port numbers are now validated to be exact integers in the range [1, 65535]. Actually complain about invalid option or unknown subcommand. Previously, the code that was supposed to do this was unreachable. Add —experimental-wasm-exnref feature flag when running hoot compile —run=node for continued compatibility with supported NodeJS versions that don’t have the new Wasm exnref feature enabled by default. Fixed build-time disabling of hoot server. In past releases, the hoot CLI script would still attempt to load should-be-optional libraries that ./configure had already determined to be missing. Thanks to mcc for discovering this blunder.

CLI 更改:端口号现在被验证为 [1, 65535] 范围内的精确整数。现在会针对无效选项或未知子命令发出警告。此前,本应执行此操作的代码是不可达的。在运行 hoot compile —run=node 时添加了 —experimental-wasm-exnref 功能标志,以便与默认未启用新 Wasm exnref 功能的受支持 NodeJS 版本保持兼容。修复了构建时禁用 hoot 服务器的问题。在过去的版本中,hoot CLI 脚本仍会尝试加载 ./configure 已经确定缺失的本应可选的库。感谢 mcc 发现了这个错误。

Documentation changes: Improved instructions in “Building from source” section of the manual. Dependencies are now mentioned in the “Advanced path” section of the README. Updated project template README to say Guix is not required (though it’s still the easiest option). Browser compatibility: Compatible with Safari 26 or later. Compatible with Firefox 121 or later. Compatible with Chrome 119 or later.

文档更改:改进了手册中“从源代码构建”部分的说明。依赖项现在在 README 的“高级路径”部分中提到。更新了项目模板 README,说明不需要 Guix(尽管它仍然是最简单的选择)。浏览器兼容性:兼容 Safari 26 或更高版本。兼容 Firefox 121 或更高版本。兼容 Chrome 119 或更高版本。

Get Hoot: Hoot is available in GNU Guix: $ guix pull $ guix install guile guile-hoot. Also, Hoot is now available in Debian, though it will take awhile for this release to make it there. Otherwise, Hoot can be built from source via our release tarball. See the Hoot homepage for a download link and GPG signature. Documentation for Hoot 0.10.0, including build instructions, can be found here.

获取 Hoot:Hoot 可在 GNU Guix 中获取:$ guix pull $ guix install guile guile-hoot。此外,Hoot 现在也可在 Debian 中使用,尽管此版本进入 Debian 还需要一些时间。否则,可以通过我们的发布压缩包从源代码构建 Hoot。请参阅 Hoot 主页获取下载链接和 GPG 签名。Hoot 0.10.0 的文档(包括构建说明)可以在这里找到。

Get in touch: For bug reports, pull requests, or just to follow along with development, check out the Hoot project on Codeberg. If you build something cool with Hoot, let us know on our community forum! Thanks to Z572, stdh, Walter Lewis, and Jelle Licht for their contributions to this release. Until next time, happy hooting! 🦉 Thanks to our supporters: Your support makes our work possible! If you like what we…

保持联系:如需提交错误报告、拉取请求,或只是想关注开发进度,请查看 Codeberg 上的 Hoot 项目。如果你用 Hoot 构建了很酷的东西,请在我们的社区论坛上告诉我们!感谢 Z572、stdh、Walter Lewis 和 Jelle Licht 对此版本的贡献。下次见,祝使用愉快!🦉 感谢我们的支持者:你们的支持使我们的工作成为可能!如果你喜欢我们所做的……