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 asScheme.load_main
inreflect.js
. -
Top-level programs must now start with a
use-modules
orimport
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 R6RSlibrary
forms to match Guile. -
Added support for integer components in R7RS
define-library
names. Example:(define-library (srfi 1) ...)
. -
Added support for
#:renamer
indefine-module
. -
Added
filter!
,reverse!
, andwith-fluids*
procedures to(guile)
. -
Added printer for record type descriptors.
-
Documented
HOOT_LOAD_PATH
environment variable.
Performance improvements
- Added optimized implementation of
min
andmax
.
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 ofhashv
was returned, causing objects what wereequal?
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 inlibrary
export
forms. -
Fixed implementation of
#:replace
indefine-module
syntax. -
Fixed
put-string
which was not respecting theport
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 withwat->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! 🦉