Hoot 0.7.0 released!

Dave Thompson —

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

Make a game with Hoot

The 2025 edition of the Autumn Lisp Game Jam starts on Friday, 10/31! Halloween jam! 🎃

For those who are unfamiliar, the Lisp Game Jam is a casual, 10-day event where participants build small games using the Lisp implementation of their choice. We encourage you to join the jam and make a game with Hoot! Browser games are both easy to distribute and easy for other people to play, which makes Hoot a great choice! itch.io, where the jam is hosted, has built-in support for browser games.

To make it easy to jump right in and start jamming, we have a ready-to-use 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, onto the full release notes!

New features

  • Added Guile’s source module directory to Hoot’s load path by default. It is now easy to import any module from Guile that Hoot does not override in its core implementation. Of course, any Guile module that relies on a C extension or as-of-yet unsupported (guile) procedure/macro will not work with Hoot. Contributors are wanted to help maximize our Guile compatibility!

  • Removed stub SRFI-1 module in favor of loading it from Guile’s source module directory. Guile now has a pure Scheme implementation of SRFI-1 (no more C!) usable by Hoot.

  • Hoot modules can now be loaded from JavaScript typed arrays and ArrayBuffer objects in methods such as Scheme.load_main in reflect.js.

  • Top-level programs must now start with a use-modules or import form. The implicit import of (scheme base) caused more confusion for users than the convenience was worth.

  • The import form in a top-level program is now interpreted using R7RS syntax rules whereas previously it used R6RS syntax rules.

  • SRFI library names such as (srfi :1) are now canonicalized as (srfi srfi-1) in R6RS library forms to match Guile.

  • Added support for integer components in R7RS define-library names. Example: (define-library (srfi 1) ...).

  • Added support for #:renamer in define-module.

  • Added filter!, reverse!, and with-fluids* procedures to (guile).

  • Added printer for record type descriptors.

  • Documented HOOT_LOAD_PATH environment variable.

Performance improvements

  • Added optimized implementation of min and max.

Bug fixes

  • Explicitly set file permissions for reflection library files copied by guild compile-wasm --bundle. This problem was especially noticeable on Guix where the files were read-only, breaking successive bundle invocations.

  • Fixed hash to return the accumulated hash value when the recursion depth limit is reached. Previously, the result of hashv was returned, causing objects what were equal? to have different hash codes.

  • Fixed define-record-type to raise a syntax error when an invalid field is specified as a constructor argument.

  • Fixed R6RS rename syntax rules in library export forms.

  • Fixed implementation of #:replace in define-module syntax.

  • Fixed put-string which was not respecting the port argument.

  • Fixed docstring for ,hoot-run-file meta-command.

  • Fixed link to Git repository URL in the manual.

  • Replaced obsolete reference to parse-wat in the manual with wat->wasm.

  • Fixed compilation of unquote-splicing in non-tail position.

  • Fixed string-trim in the case where the result should be the empty string.

  • simple-format now returns the unspecified value rather than zero values.

  • Fixed select instruction handling in Wasm toolchain.

Browser compatibility

  • Compatible with Safari 26! 🎉 At long last, Hoot modules now work reliably in Safari and other sufficiently fresh WebKit-based browsers.

  • Compatible with Firefox 121 or later.

  • Compatible with Chrome 119 or later.

Get Hoot 0.7.0

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.7.0, 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!

Thanks to our supporters

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

Diamond tier

  • Aeva Palecek
  • Daniel Finlay
  • David Anderson
  • Holmes Wilson
  • Lassi Kiuru

Gold tier

  • Juan Lizarraga Cubillos

Silver tier

  • Adam King
  • Austin Robinson
  • Brian Neltner
  • Brit Butler
  • Charlie McMackin
  • Dan Connolly
  • Danny OBrien
  • Deb Nicholson
  • Eric Schultz
  • Evangelo Stavro Prodromou
  • Evgeni Ku
  • Glenn Thompson
  • James Luke
  • Jonathan Frederickson
  • Joshua Simmons
  • Justin Sheehy
  • Michel Lind
  • Mikayla Maki
  • Mike Ledoux
  • Nathan TeBlunthuis
  • Nia Bickford
  • Noah Beasley
  • Shane Redman
  • Steve Sprang
  • Travis Smith
  • Travis Vachon

Bronze tier

  • Alan Zimmerman
  • Alex Poylisher
  • BJ Bolender
  • Ben Hamill
  • Benjamin Grimm-Lebsanft
  • Brooke Vibber
  • Brooklyn Zelenka
  • Carl A
  • Crazypedia No
  • François Joulaud
  • Grant Gould
  • Gregory Buhtz
  • Ivan Sagalaev
  • Jason Wodicka
  • Jeff Forcier
  • Louis Jackman
  • Marty McGuire
  • Mason DeVries
  • Neil Brudnak
  • Nelson Pavlosky
  • Philipp Nassua
  • Robin Heggelund Hansen
  • Rodion Goritskov
  • Ron Welch
  • Stephen Herrick
  • Steven De Herdt
  • Sébastien Rey-Coyrehourcq
  • Tamara Schmitz
  • Thomas Talbot
  • William Murphy
  • r g
  • terra tauri

Until next time, happy hooting! 🦉