在元循环求值器中添加原语

Adding primitives in metacircular evaluator

我正在研究 metacircular 求值器,我正在尝试添加原始过程。我几乎完成了,除了我不确定如何添加错误。这是我目前所拥有的:

(define primitive-procedures
  (list (list 'car car)
        (list 'cdr cdr)
        (list 'cons cons)
        (list 'null? null?)
        (list '+ +)
        (list '* *)
        (list '- -)
        (list '/ /)
        (list '< <)
        (list '<= <=)
        (list '= =)
        (list '>= >=)
        (list '> >)))

到目前为止这有效。我尝试为错误添加 (list '(error) (error "Metacircular Interpreter Aborted")),但它显然不起作用...我该怎么做?

谢谢!

它和其他基元一样,你只需要像这样添加它:

(list 'error error)

与其他基元没有区别。

 (define primitive-procedures
  (list (list 'car car)
        ...
        (list '> >)
        (list 'error error)))

与所有其他的一样,在底层实现中检查了 arity。这意味着您需要提供一个参数,例如。 (error "something bad happened") 将在解释器中工作。从尝试使用 (error) 开始,我猜您希望在没有参数的情况下使用它,您需要提供一个不带参数的过程。以下是我的做法:

 (define (error-primitive)
   (error "Metacircular Interpreter Aborted"))

 (define primitive-procedures
  (list (list 'car car)
        ...
        (list '> >)
        (list 'error error-primitive)))

现在,当您调用 (error) 时,它会调用 lambda,并且会调用 (error "Metacircular Interpreter Aborted")。您也可以只在 primitive-procedures 定义中放置一个 lambda,但是如果您正在做一个更多数据驱动程序版本的解释器,稍后给它起一个名字会有所帮助,因为此时它被视为与 >.

当你进一步进步时,你将学习如何在不使用源语言的 error 的情况下捕获目标语言中的错误。

这可以使用 monad、current-continuation、continuation passing style、control with shift/reset 等概念来完成