-1

我正在研究元循环评估器,并且正在尝试添加原始程序。我差不多完成了,除了我不确定如何添加错误。这是我到目前为止所拥有的:

(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"))错误,但它显然不起作用......我该怎么做?

谢谢!

4

3 回答 3

3

它与其他原语相同,您只需像这样添加它:

(list 'error error)
于 2020-02-04T22:27:12.850 回答
2

当您进一步推进某些事情时,您将学习如何在目标语言中捕获错误,而无需使用error源语言中的。

这可以使用诸如 monad、current-continuation、continuation 传递样式、移位/重置控制等概念来完成。

于 2020-02-09T08:59:36.590 回答
1

与其他原语没有区别。

 (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,但如果您稍后正在执行解释器的更多数据驱动程序版本,则给它一个名称将对此有所帮助,因为此时它被视为与>.

于 2020-02-06T11:16:33.823 回答