Scheme 是一个 Hoot
摘要
作者分享了学习 Scheme 并使用 Hoot 将其编译为 WebAssembly 的经验,虽然遇到了稳定性问题,但成功在浏览器中运行了物理模拟。
<p><a href="https://lobste.rs/s/jchp72/scheme_is_hoot">评论</a></p>
查看缓存全文
缓存时间: 2026/07/05 10:29
# Scheme 是一门 Hoot 语言
来源:https://gracefulliberty.com/notes/scheme-is-a-hoot/
2026-05-21· 3 分钟· #计算 (https://gracefulliberty.com/articles/tags/computing)
最近我一直在花时间学习 Scheme,并用它来实现我在物理课上学的概念,时间允许就做一点。其中最令人兴奋的事情之一是,借助 Hoot,我成功让 Scheme 代码在 Web 上编译运行。
最大的挑战之一是 Hoot 并不稳定。目前它的版本是 0.9.0。文档还算可以,但还可以更好。错误消息有时很费解。但是,看到 Scheme 代码通过 WASM 在 Web 上运行,已经是一个巨大的成就。更不可思议的是,它运行在团队自己创建的栈上,而不是依赖 Emscripten。
我最初以为 Hoot 可以将任何 Guile 程序编译到 Web。当我的代码无法编译时,我很快就发现自己错了。于是我将代码移植为使用 Hoot 版本的所有函数,导致我的代码无法脱离 Hoot 独立运行。后来我才意识到,Hoot 实际上支持比我想象中*更多*的 Guile 功能。我只需要手动导入很多之前我以为理所当然的东西。
现在,我已经将代码设置为既能在原生 Guile 上运行,也能通过 Hoot 在 WASM 上运行,并且测试会在两个环境中自动运行,以确保两个环境都能正确配置。虽然有点麻烦,但现在已经可以工作了。我的大部分代码不关心是在系统的 Guile 解释器中运行,还是被编译为 WASM 并在浏览器中运行。我觉得这很了不起。
目前,我完成的大部分工作都在后端。让整个设置能够正常工作已经够折腾了。我也一直在努力让更基础的物理逻辑能够运行,对于 Scheme 新手来说尤其困难。但我一直在取得进展,并且在我的网站的一个新页面上发布了一个小原型(https://gracefulliberty.com/physics/),还发布了源代码(https://codeberg.org/liberty/physics)。
未来,我很好奇是否可以用 Hoot 将 Zig 和 Scheme 程序一起编译到 Web。我越来越觉得 Zig 和 Scheme 是完美的组合,我想在这方面做更多实验。这可能太复杂了!我还不知道。在 WASM 的世界里有很多东西需要学习,而这正是乐趣的一部分。
这是一次深入 Scheme 世界的富有洞察力的探索。我迫不及待想做更多。
相似文章
Hoot 0.9.0 发布
Hoot 0.9.0,一个用于 Guile 的 Scheme 到 WebAssembly 编译器后端,已发布,包含新功能和错误修复,包括 DWARF 支持、标准 Wasm 异常,以及为 Lisp Game Jam 提供的游戏 jam 模板。
@msimoni:我一天内创建了这个,它有点像拼凑的语言,但确实有一些有趣的想法和结果:Idle…
一位开发者创建了 Idle,这是一个用于 WebAssembly GC 的静态类型、低级 Lisp,具有 O(1) 方法查找和从 Wasm 模块加载宏等有趣功能。
Show HN: 用汇编语言构建 Web 服务器,为我的生命赋予(些许缺乏的)意义
ymawky 是一个专为 macOS 编写的 ARM64 汇编 Web 服务器,其特点是不依赖 libc 仅使用系统调用,并具备基本的 HTTP 功能。
@msimoni: 这表明通过一些非常简单的宏方法,WebAssembly 几乎是一个可以直接编写的、可识别的 Lisp。
文章探讨了如何利用类似 Lisp 的宏来改进 WebAssembly,使其语法更易于人类理解,并提及了 Joel Martin 此前用 JavaScript 实现的相关内容。
Show HN: 运行于 WebAssembly 的 Firefox
Firefox 被编译为在 WebAssembly 中运行,采用基于 WebGL 的渲染和实验性的 JS 到 WASM JIT,网页内容通过 Puter 托管的 Wisp 服务器进行代理。