Hoot 0.9.0 released

Hoot 0.9.0 released

Hoot 0.9.0 released! Dave Thompson — May 13, 2026

Hoot 0.9.0 发布了! Dave Thompson — 2026年5月13日

We are excited to announce the release of Hoot 0.9.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.8.0 release back in February.

我们很高兴地宣布 Hoot 0.9.0 发布!Hoot 是一个面向 Guile 的 Scheme 到 WebAssembly 编译器后端,同时也是一个通用的 WebAssembly 工具链。换句话说,就是浏览器里的 Scheme!自二月份发布 0.8.0 版本以来,此版本包含了多项新功能和错误修复。

Use Hoot in the upcoming Lisp Game Jam! On Friday (May 15th 2026), the Spring 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 Game Jam 中使用 Hoot!春季版 Lisp Game Jam 将于本周五(2026年5月15日)开始!这是一个为期 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

该模板项目包含了你快速开始使用 Hoot 制作 HTML5 游戏所需的一切。模板仓库包括:

  • 用于制作 HTML5 Canvas 交互式游戏的必要 Web API 绑定
  • 一个用于编译、运行开发 Web 服务器以及生成可上传至 itch.io 的 .zip 包的 Makefile
  • 一个非常简单的类似“打砖块”的游戏示例,展示了如何将所有组件整合在一起

Thanks to contributor Gonzalo Delgado, the game jam template now features gamepad input support! For more inspiration, here are some games made with Hoot for past jams: Cirkoban, Strigoform, Shields.

感谢贡献者 Gonzalo Delgado,现在的游戏开发模板已支持游戏手柄输入!如需更多灵感,以下是一些在往届比赛中使用 Hoot 制作的游戏:Cirkoban、Strigoform、Shields。

TYVM. Now, onto the release notes!

非常感谢。现在,进入发布说明!

Toolchain changes

  • Added the concept of host provided types. Useful for Hoot on Wastrel support.
  • Switched from legacy exceptions to standard Wasm exceptions, which were officially adopted in July 2025 but have been available in browsers for much longer. The --experimetal-wasm-exnref flag is passed to NodeJS in case it is old enough to still require this feature flag (which is currently the case for Guix).
  • Added support for DWARF custom section.

工具链变更

  • 增加了“宿主提供类型”(host provided types)的概念,这对 Hoot 在 Wastrel 上的支持很有用。
  • 从旧版异常切换到标准 Wasm 异常。标准 Wasm 异常于 2025 年 7 月正式采用,但在浏览器中早已可用。如果 NodeJS 版本较旧仍需此功能标志(目前 Guix 的情况就是如此),则会传递 --experimetal-wasm-exnref 标志。
  • 增加了对 DWARF 自定义段的支持。

Compiler changes

  • Replaced function name/source metadata with DWARF.
  • Changed default debug level to 1, which now includes emitting DWARF. For a production build stripped of all debug data, use debug level 0 (-g0 in the CLI) or strip the binary afterwards using hoot strip.
  • Update compiler backend for new primitive bytevector predicates introduced in Guile 3.0.11.
  • Added support for bitvector literals on big endian host systems.

编译器变更

  • 用 DWARF 替换了函数名/源代码元数据。
  • 将默认调试级别更改为 1,现在包括输出 DWARF 信息。对于剔除所有调试数据的生产构建,请使用调试级别 0(CLI 中为 -g0),或随后使用 hoot strip 剔除二进制文件。
  • 更新编译器后端以支持 Guile 3.0.11 中引入的新原始字节向量(bytevector)谓词。
  • 增加了对大端序宿主系统上位向量(bitvector)字面量的支持。

Runtime changes

  • Floating point number to string conversion is now implemented in Scheme rather than relying on an import. This makes binaries slightly bigger but makes it easier to support Hoot on Wastrel and non-JavaScript runtimes generally.
  • Bignum imports have been monomorphized to ease non-JavaScript runtimes (Wastrel, again).
  • Scheme binaries now export a main function that takes 0 arguments and returns 0 values that invokes the internal $load function. This makes it posible for Wastrel to boot a Hoot program without support for the Scheme reflection interface.
  • Added DWARF parser to reflect.js.
  • Removed fsqrt import in favor of using f64.sqrt instruction.

运行时变更

  • 浮点数转字符串的转换现在由 Scheme 实现,不再依赖导入。这会使二进制文件略微变大,但更容易在 Wastrel 和一般的非 JavaScript 运行时上支持 Hoot。
  • 大整数(Bignum)导入已进行单态化(monomorphized),以简化非 JavaScript 运行时(又是 Wastrel)的支持。
  • Scheme 二进制文件现在导出一个不带参数且返回 0 值的 main 函数,该函数调用内部的 $load 函数。这使得 Wastrel 可以在不支持 Scheme 反射接口的情况下引导 Hoot 程序。
  • reflect.js 中添加了 DWARF 解析器。
  • 移除了 fsqrt 导入,改用 f64.sqrt 指令。

Scheme changes

  • Range errors now include the range in the exception irritants list.
  • Added uint8array->bytevector procedure to (hoot typed-arrays).
  • Vectors are now considered self-evaluating in (hoot expander).
  • Added internal (hoot module-syntax) module to gather runtime module macros and support code.
  • define-record-type now works in the Scheme interpreter for record types with up to 8 fields. (Supporting more than 8 fields is planned but will require larger changes to the Hoot runtime.)

Scheme 变更

  • 范围错误现在将范围包含在异常刺激列表(exception irritants list)中。
  • (hoot typed-arrays) 中添加了 uint8array->bytevector 过程。
  • 向量现在在 (hoot expander) 中被视为自求值(self-evaluating)。
  • 添加了内部模块 (hoot module-syntax) 以收集运行时模块宏和支持代码。
  • define-record-type 现在可以在 Scheme 解释器中处理最多 8 个字段的记录类型。(计划支持超过 8 个字段,但这需要对 Hoot 运行时进行更大的更改。)

CLI changes

  • guild compile-wasm has been deprecated in favor of the new hoot compile subcommand. Both commands accept the same flags.
  • Added hoot help subcommand.
  • Added hoot strip subcommand to remove debugging information from a Wasm binary.
  • Feature flags have been split out from debug options in hoot compile/guild compile-wasm. For example, -gruntime-modules is no longer valid; use -fruntime-modules instead. The -g flag now exclusively handles debugging data such as whether to emit DWARF or a names section. The -f flag handles things that change program behavior such as whether to include a runtime module system for use with the Scheme interpreter.

CLI 变更

  • guild compile-wasm 已弃用,取而代之的是新的 hoot compile 子命令。两个命令接受相同的标志。
  • 添加了 hoot help 子命令。
  • 添加了 hoot strip 子命令,用于从 Wasm 二进制文件中删除调试信息。
  • hoot compile/guild compile-wasm 中,功能标志已从调试选项中分离出来。例如,-gruntime-modules 不再有效;请改用 -fruntime-modules-g 标志现在专门处理调试数据,例如是否输出 DWARF 或名称段。-f 标志处理改变程序行为的事项,例如是否包含用于 Scheme 解释器的运行时模块系统。

Documentation changes

  • Updated manual to use hoot compile instead of guild compile-wasm.
  • hoot compile --bundle is now recommended in web deployment section rather than manually copying support files.

文档变更

  • 更新手册,使用 hoot compile 代替 guild compile-wasm
  • 在 Web 部署部分,现在推荐使用 hoot compile --bundle,而不是手动复制支持文件。

Bug fixes

  • The repl.js file missing from 0.8.0 (which broke hoot repl) is now included in the release tarball. Apologies for the oversight!
  • Fixed pathologically large function emitted by lower-globals, which Wasm engines such as Wastrel can struggle with. Instead, many smaller functions are emitted.
  • hash-set!, hashq-set!, etc. now return the passed value. This matches Guile’s behavior and allows more existing Guile programs to work as expected.
  • Fixed bug in parsing zero-length custom sections in Wasm binaries.
  • Fixed validation of return_call_indirect instruction.
  • Fixed missing EOF handler in REPL meta-command reader.

错误修复

  • 0.8.0 版本中缺失的 repl.js 文件(导致 hoot repl 损坏)现已包含在发布压缩包中。对此次疏忽表示歉意!
  • 修复了 lower-globals 输出的病态大函数问题,Wastrel 等 Wasm 引擎难以处理此类函数。现在改为输出许多较小的函数。
  • hash-set!hashq-set! 等现在返回传入的值。这与 Guile 的行为一致,并允许更多现有的 Guile 程序按预期工作。
  • 修复了 Wasm 二进制文件中解析零长度自定义段的错误。
  • 修复了 return_call_indirect 指令的验证。
  • 修复了 REPL 元命令读取器中缺失 EOF 处理程序的问题。

Browser compatibility

  • Compatible with Safari 26 or later.
  • Compatible with Firefox 121 or later.
  • Compatible with Chrome 119 or later.

浏览器兼容性

  • 兼容 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.9.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.9.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!

联系我们

如需提交错误报告、拉取请求,或仅仅是关注开发进度,请查看 Codeberg 上的 Hoot 项目。如果你用 Hoot 构建了很酷的东西,请在我们的社区论坛上告诉我们!

Thanks to our supporters

Your support makes our work possible! If you like what we do, please consider becoming a Spritely supporter today!

感谢我们的支持者

你们的支持使我们的工作成为可能!如果你喜欢我们所做的事情,请考虑今天成为 Spritely 的支持者!