yfaming on Nostr: 最近在了解 steel 项目 steel 是用 Rust 实现的 Scheme,兼容 R5RS ...
最近在了解 steel 项目
https://github.com/mattwparas/steelsteel 是用 Rust 实现的 Scheme,兼容 R5RS 标准。它的特色在于可嵌入,适合给 Rust 项目做配置、脚本、插件、DSL 等等。Scheme 风格极简,但表达力强大,语言核心很小,天然适合这种嵌入式脚本语言场景。
通过 steel 可以很方便地在 Rust 和 Scheme 之间相互操作。既可以将 Rust 侧的类型、函数、值暴露给 Scheme 使用,也可以通过 Engine API 访问 Scheme 侧的值、函数等。
在 R5RS 之外,steel 提供了类似 Racket 的模块系统,并提供了比 R5RS 的 syntax-rules 更强大的 syntax-case 宏。
steel 项目还在早期,helix 编辑器已经在考虑用它来实现插件系统了。
就我个人来说,Rust 算是我最喜欢的语言,而自从去年认真学习 Racket/Scheme 后,也觉得越来越有意思。毕竟,哪个程序员能抵挡 Lisp 传奇的诱惑呢?通过 steel 将 Rust 和 Scheme 结合起来,简直挠到了最痒的地方。😂
我尝试着将 Rust 的 log crate 暴露给 Scheme。
首先将 `log` 的常用 API 包装了一下,建立一个 BuiltInModule 实例,并注册这些类型和函数,然后注册这个 BuiltInModule。这样,在 Scheme 侧就可以直接 require 这个模块并访问它的 API 了。
以这个模块为基础,我又用 Scheme 定义了一些 high-level 且 ergonomic 的 API,然后通过 `Engine::register_steel_module` 将这部分 Scheme 代码注册为模块。此后,Scheme 代码只需调用这个 high-level 模块的 API 即可。
通过这个小库,Scheme 中就可以比较自然地使用 Rust 日志库了。而这一切,只不过是 100+ 行的 Rust 代码,和 100- 行的 Scheme 代码而已。
Published at
2026-06-27 10:33:15 CESTEvent JSON
{
"id": "ac76ca0e1fedd41512235941bef017d92f7d5ab67c1866a8407f4b89c5663122",
"pubkey": "908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4",
"created_at": 1782549195,
"kind": 1,
"tags": [],
"content": "最近在了解 steel 项目 https://github.com/mattwparas/steel\n\nsteel 是用 Rust 实现的 Scheme,兼容 R5RS 标准。它的特色在于可嵌入,适合给 Rust 项目做配置、脚本、插件、DSL 等等。Scheme 风格极简,但表达力强大,语言核心很小,天然适合这种嵌入式脚本语言场景。\n\n通过 steel 可以很方便地在 Rust 和 Scheme 之间相互操作。既可以将 Rust 侧的类型、函数、值暴露给 Scheme 使用,也可以通过 Engine API 访问 Scheme 侧的值、函数等。\n\n在 R5RS 之外,steel 提供了类似 Racket 的模块系统,并提供了比 R5RS 的 syntax-rules 更强大的 syntax-case 宏。\n\nsteel 项目还在早期,helix 编辑器已经在考虑用它来实现插件系统了。\n\n就我个人来说,Rust 算是我最喜欢的语言,而自从去年认真学习 Racket/Scheme 后,也觉得越来越有意思。毕竟,哪个程序员能抵挡 Lisp 传奇的诱惑呢?通过 steel 将 Rust 和 Scheme 结合起来,简直挠到了最痒的地方。😂\n\n我尝试着将 Rust 的 log crate 暴露给 Scheme。\n\n首先将 `log` 的常用 API 包装了一下,建立一个 BuiltInModule 实例,并注册这些类型和函数,然后注册这个 BuiltInModule。这样,在 Scheme 侧就可以直接 require 这个模块并访问它的 API 了。\n\n以这个模块为基础,我又用 Scheme 定义了一些 high-level 且 ergonomic 的 API,然后通过 `Engine::register_steel_module` 将这部分 Scheme 代码注册为模块。此后,Scheme 代码只需调用这个 high-level 模块的 API 即可。\n\n通过这个小库,Scheme 中就可以比较自然地使用 Rust 日志库了。而这一切,只不过是 100+ 行的 Rust 代码,和 100- 行的 Scheme 代码而已。",
"sig": "df8bd4c0aa9bef716e04df7c0b7c6ed6b59c385079c6938b5d6764a9a7fae1d1c0ea0d18b5abafb0581fde4f4b1f50280445af1cc55909a6c908fa9d7ae41a9f"
}