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 forguild 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)
intoeval
. -
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
andvector-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?
andcall-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
andreturn_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! 🦉