最近在了解 steel 项目
steel 是用 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 代码而已。
GitHub
GitHub - mattwparas/steel: An embedded scheme interpreter in Rust
An embedded scheme interpreter in Rust. Contribute to mattwparas/steel development by creating an account on GitHub.
