Become a Spritely supporter today!

We've reached our original goal of $80,000!! We couldn't be happier with the amount of support and attention we've been getting. We are now offering a stretch goal of an additional $40,000 along with even more rewards!

We're building the next generation of distributed web technology for secure collaboration. Help us fill up our health bar even further

$81,340 of $120,000 raised so far! Please support Spritely!

Guile Hoot 0.6.0 released!

Dave Thompson —

Hoot version 0.6.0

We are excited to announce the release of Hoot 0.6.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!

But first, a humble ask

If you like what Spritely is doing with Hoot or any of our other projects, please consider showing your appreciation with a donation! We recently hit our initial fundraising goal of $80,000 USD and announced a stretch goal. For the stretch goal, we will use Hoot to build a learning environment for Goblins and advance Hoot’s live hacking abilities in the process.

Monthly supporters at the silver, gold, and diamond tiers will have their names featured in the credits of Cirkoban, a small web game built with Hoot, as a display of our gratitude.

Okay, back to the show!

Highlights

  • Much improved weak hashtable support in (hoot hashtables). Weak key hashtables have been reimplemented in Scheme rather than using JavaScript’s WeakMap and are now iterable, as they are in Guile. Weak key hashtables now have company: Weak value and doubly weak hashtables have been added. The Guile legacy hashtable API has likewise been updated to support all forms of weak hashtables. As a bonus, we also have weak vectors thanks to a contribution from Vivianne Langdon.

  • Hoot now implements enough of Guile (or provides sufficient alternatives for APIs that are not web compatible) to compile nearly all of the Goblins source code. Stay tuned for another blog post about this progress!

  • As of December 9th, 2024, WebKit now ships with Wasm GC and tail calls enabled by default. These were the remaining blocker issues for running Hoot programs on Safari and other WebKit-derived browsers. Previously, Hoot couldn’t run on iOS because Safari is the only browser available on that platform. That said, we think there might be an issue with WebKit’s Wasm implementation. We’d like to gather more data so please let us know how things work for you on WebKit!

Try Hoot

Can I interest you in some eval?

Read on for the full release notes.

New features

  • Added (hoot expander) module with a port of Guile’s psyntax. This was a major undertaking by Andy Wingo but we didn’t have time to hook it up to eval for this release. Stay tuned!

  • Added (hoot finalization) module.

  • Added (hoot primitive-eval) module for evaluating macro-expanded, lowered Tree-IL.

  • Added (hoot environments) module.

  • Added (hoot modules) module.

  • Added (hoot weak-refs) module.

  • Added (ice-9 weak-vector) module. Thanks to Vivianne Langdon.

  • Reimplemented weak key and added weak value and doubly weak hashtables to (hoot hashtables).

  • Added weak hashtable support to legacy Guile hashtable API.

  • Added initial implementation of applicable records, undocumented for the moment while we figure out what the public API should be.

  • File ports now track their line/column.

  • syntax->datum and datum->syntax now work on the Wasm target.

  • Added read-syntax.

  • Added --user-imports flag to guild compile-wasm for user code that defines Wasm function imports.

  • Added support for syntax transformers on the Wasm target.

  • Added vector-binary-search to (hoot vectors).

  • Added partial, temporary SRFI-14 implementation (character sets).

  • Added partial implementation of inet-pton to (guile).

  • Switched eval to use modules as representation of environments.

  • Added partial implementation of while to (guile).

  • Replaced define-inlinable stub with real implementation.

  • Added string-rindex, string-trim, string-trim-both, string-trim-right, and string-reverse to (guile).

  • capture-stack, stack-height, and print-backtrace are now exported from (hoot error-handling).

  • Added any, every1, every, filter-map, and find to temporary SRFI-1 module (eventually you will just import the one from Guile).

  • Added &external-error exception type.

  • Added const to (guile).

  • Added issue-deprecation-warning to (guile).

  • Added ceiling-quotient, ceiling-remainder, ceiling/, euclidean-quotient, euclidean-remainder, euclidean/ procedures to (guile).

  • Added iota to (guile).

  • Added read-string implementation to (ice-9 rdelim).

  • Trimmed default set of imports to compiler to just (scheme base) to reduce compilation time.

  • Added target-side procedure-property scaffolding.

  • Added procedure-name procedure.

  • Partially implement R7RS exit procedure (it exits but doesn’t deal with dynamic-winds in effect.)

  • map and for-each now support more than two lists, at last.

  • Added simple terminal REPL demo to the Git repository.

Bug fixes

  • Fixed auxilary modules not being added to *all-instances* table when running Wasm in Hoot’s VM.

  • Guile no longer terminates when a Hoot module calls its internal quit function.

  • (hoot ports) API is now usable at expansion time.

  • Fixed f32.copysign and f64.copysign instructions in (wasm vm).

  • Fixed Fix define-exception-type when deriving exception types with fields.

  • Fixed cond-expand in define-library forms.

  • Fixed parsing of br_on_cast and br_on_cast_fail instructions in (wasm parse).

  • string-copy is now usable at expansion time.

  • Improved hashtable size lower bound calculation to avoid some bad resizing behavior.

  • Fixed legacy Guile hashtable API to return the unspecified value for hash-set!, hash-remove!, and hash-clear!.

  • Fixed Wasm generated for s64->f64 primitive.

  • Fixed unbounded exception raising loop when exception handler prompt is not on the current dynamic stack. This could occur when an exception handler is established before spawning a fiber, for example.

  • Fix compilation of %inline-wasm that returns 0 or 2+ values.

  • String comparison procedures are now usable at expansion time.

  • Fixed memory leak in library group expansion.

  • Fixed stream I/O implementation on Hoot VM.

Browser compatibility

  • Compatible with Firefox 121 or later.

  • Compatible with Google Chrome 119 or later.

  • Compatible with Safari/WebKit 18.2 or later. Finally!

Get Hoot 0.6.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.6.0, including build instructions, can be found here.

Hoot at FOSDEM

I (Dave) will be presenting “Minimalist web application deployment with Scheme” on Sunday, February 2nd in the Declarative and Minimalistic Computing devroom. Hoot will be a major focus of the presentation. This talk, like all FOSDEM talks, will be livestreamed and a recording will be available sometime after the conference.

For all the details about Spritely’s presence at FOSDEM, see our recent blog post.

Get in touch!

For bug reports, pull requests, or just to follow along with development, check out the Hoot project on GitLab.

If you build something cool with Hoot, let us know on our community forum!

Thanks to Christine Lemmer-Webber for the lovely Hoot pixel art, and a special thanks to the MetaMask folks for funding this work!

Until next time, happy hooting! 🦉