Hoot 0.6.1 released!

Dave Thompson —

We are excited to announce the release of Hoot 0.6.1! 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 small patch release contains bug fixes and a few new features added since the 0.6.0 release back in January. Just in time for the upcoming Lisp Game Jam!

Make a game with Hoot!

The 2025 edition of the Spring Lisp Game Jam starts on Friday, 5/9! The Lisp Game Jam is a casual, 10-day long event where participants build small games using the Lisp implementation of their choice. We’d like to encourage you to join the jam and try making a game with Hoot! Hoot is a great choice for game jams because web-based games are both easy to distribute and easy for other people to play.

To make it easy to jump right in and make a game with Hoot, we have a ready-to-go template repository on Codeberg that you can clone. It takes care of all the boilerplate and provides some useful bindings to essential web APIs like HTML5 Canvas.

Okay, game jam promotion over! Read on for the full release notes.

New features

  • New --bundle flag for guild compile-wasm that will automatically install runtime libraries alongside the generated binary (reflect.js, reflect.wasm, wtf8.wasm).

  • Integrated psyntax-based macro expander (hoot expander) into eval.

  • Add -g flag for controlling compiler debug level.

  • Changed current-module to require compilation with -g.

  • Changed (hoot environments) to use run-time module registry.

  • Added logcount and vector-move-left! procedures, part of Guile's default environment.

  • Added experimental (hoot time) module for date/time calculations (currently undocumented).

  • Internal make-port procedure now uses keyword arguments.

  • Keyword error constructors are now exported from Hoot's Wasm ABI.

  • Added external-function? and call-external to (hoot ffi).

  • Added quote-syntax to (hoot core-syntax) and (hoot syntax).

  • Documented (fibers streams) module.

Bug fixes

  • Fixed inexact->exact conversion for a subset of flonums.

  • Fixed number->string for radix 16.

  • Fixed current-time which was mistakenly using jiffies.

  • Fixed string-split when delimiter is the first character in the string.

  • Fixed string-utf8-length opcode emission.

  • Fixed define-values macro that was causing compilation errors on newer Guile Git builds.

  • Fixed cond-expand error condition.

  • Fixed Wasm linker handling of call_ref and return_call_ref.

  • Fixed Wasm linker handling of catch bodies.

  • Fixed ,wasm-eval metacommand.

  • Fixed NodeJS example in the manual. Thanks to Jelle Licht for the patch!

  • External references now have a printed representation.

  • Exported sleep from (fibers) to match upstream Fibers API.

Performance improvements

  • Optimized Wasm validation pass (validate-wasm).

  • Optimized Wasm linker (add-stdlib).

  • Optimized Wasm resolver (resolve-wasm).

  • Optimized Wasm emission in compiler backend (high-level-cps->wasm).

Browser compatibility

  • Compatible with Firefox 121 or later.

  • Compatible with Google Chrome 119 or later.

  • Compatibility with Safari/WebKit is still a bit complicated, unfortunately. We thought everything was in place when Hoot 0.6.0 was released, but then we found a bug in WebKit’s Wasm tail call implementation. This bug was fixed nearly two months ago but the fix has not yet propagated out to stable Safari and iOS releases, as far we’re aware. We verified that some of our larger Hoot programs are now working on a Git build of WebKit, so we are optimistic that Hoot will finally be supported on all major browsers soon.

Get Hoot 0.6.1!

Hoot is already available in GNU Guix:

$ guix pull
$ guix install guile-next guile-hoot

(Hoot currently requires a bleeding-edge version of Guile, hence guile-next above.)

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.6.1, including build instructions, can be found here.

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 (for the upcoming game jam or otherwise), let us know on our community forum!

Special thanks to the MetaMask folks for funding this work!

Until next time, happy hooting! 🦉