Rust类型系统中的Lisp

Hacker News Top 工具

摘要

一个嵌入在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 的影响

Hacker News Top

一篇技术博客文章,探讨 Ruby 的设计(包括闭包、一等函数、符号和方法命名约定)如何受到 Lisp 的影响。