Rust类型系统中的Lisp
摘要
一个嵌入在Rust trait系统中的Lisp解释器,支持在编译时进行递归函数、闭包和延续传递风格。
暂无内容
查看缓存全文
缓存时间: 2026/06/22 07:31
playX18/lisp-in-types 来源:https://github.com/playX18/lisp-in-types
lisp-in-types Rust特质系统中的Lisp
限制
- 每个符号必须通过
defkey!()宏手动声明 - 数字不能为负数
- 数字仅限于0..8192范围内,您可以修改build.rs生成更多自然数,但需要增加
RUST_MIN_STACK后运行。 - 没有
(defmacro ...) - 没有
eval - 我尚未对其进行广泛测试。
特性
- 递归函数
- 全局和词法环境(通过
let绑定) - 函数调用
apply正常运作call/ec
示例
阶乘:
type DefFac = expr!(defun SymFac (SymN) (if (= SymN 0) 1 (* SymN (SymFac (- SymN 1)))));
type Global2 = <ApplyDefun<AppendGlobal, DefFac>>::GlobalOut;
type Fac5 = EvalValue<ApplyDefun<Global2, expr!((SymFac 5))>>;
assert_same::<Fac5, expr!(120)>();
println!("(fac 5) => {:?}", <Fac5 as ToRuntime>::to_rt());
call/ec (定界)
// call/ec 演示(逃逸续延,显式标签):
// (call/ec cc (lambda (k) (+ 1 (k 5)))) => 5
defkey!(SymCC, N10);
defkey!(SymK, N11);
type CallECExpr = expr!((call/ec SymCC (lambda (SymK) (+ 1 (SymK 5)))));
type CallECResult = EvalValue<CallECExpr>;
assert_same::<CallECResult, expr!(5)>();
println!(
"(call/ec cc (lambda (k) (+ 1 (k 5)))) => {:?}",
<CallECResult as ToRuntime>::to_rt()
);
相似文章
Lisp 对 Ruby 的影响
一篇技术博客文章,探讨 Ruby 的设计(包括闭包、一等函数、符号和方法命名约定)如何受到 Lisp 的影响。
Lunacy - 具备惰性基本块版本化与JIT的Lua 5.1解释器
Lunacy 是一个用Rust编写的Lua 5.1解释器,实现了惰性基本块版本化和即时编译器,详细信息见技术博客文章。
@blackanger: 从 Epic Lora 里蒸馏了不少好的实践
An experiment on using Rust's type system as an AI coding specification, distilling practices from Epic Lora.
将OCaml运行时从C语言逐行翻译为Rust
该项目详细介绍了将OCaml运行时从C语言逐行翻译为Rust的过程,旨在提高安全性和性能。
在浏览器中试用 LispE
关于在浏览器中试用 LispE(一种 Lisp 方言)的简要介绍或链接。