Sheme r1rs 字节码

Sheme r1rs bytecode

提问人:Benefixx 提问时间:8/28/2023 更新时间:8/28/2023 访问量:51

问:

我有一个简单的 tree-walking 解释器用于方案 r1rs。我使用 Rust 来做它。Lisp 解释器是 s-expressions 解释器,这就是我有这些 AST 节点的原因:

enum SExpression<'a> {
    Nil,
    Atom(Atom<'a>),
    Pair(Box<Pair>)
}

enum Atom<'a> {
    Identifier (&'a str),
    Number(i32),
    String(String)
}

struct Pair<'a> {
    car: SExpression<'a>,
    cdr: SExpression<'a>
}

像 lambda 这样的结构在我的实现中是宏。 我想用字节码和 VM 重写我的解释器。

  1. 我无法为 SExpression 选择好的字节码。
  2. funcall 和宏的语法是相同的。在评估它之前,我不知道如何调用组合的第一个参数。

我检查了“Lisp in small pieces”中的例子,但在本书中,字节码对我来说很难。而且我没有看到 AST 定义

Rust 编译 方案 字节码

评论

0赞 Sylwester 8/29/2023
确定是RRS吗?它更类似于今天的 Common Lisp,而不是 Scheme。 和循环 😮labelsdo
0赞 Sylwester 8/29/2023
顺便说一句,Lisp in small peaces 是关于解释器的,而不是编译的。你需要。要选择闭包约定,请堆叠参数的顺序。宏在编译时展开,通常在编译之前。在使用顶级宏之前,应要求它们已完全定义,并且在运行时不支持它们(编译器/VM 将将其视为未定义的函数)
0赞 Benefixx 9/4/2023
@Sylwester我解决了我的问题。我的英语很差,但我试着解释。在字节码编译器中,我构建了symtable,我在其中编写var类型,如func,macro或atom(number/string)。当我编译组合时,我检查第一个 arg,如果它是 var 我看 symtable,如果是 atom 我会因错误而恐慌,最有趣的是,如果它是另一个组合,编译器认为它是 func,因为我们无法返回宏(我在一些方案编译器中检查它,我会做同样的事情), 如果是 Atom,我会在运行时感到恐慌。
0赞 Sylwester 9/4/2023
当运算符不是宏时,不能始终推断运算符类型。例如。 是完全有效的 Scheme,并且预期返回一个可以使用两个数值参数应用的函数。我不认为您的字节码 vm 应该知道宏,因为它们应该在转换为字节码之前进行扩展。从而展开宏,编译为字节码,运行。((some-fun arg) 1 2)some-fun

答: 暂无答案