我正在研究元级评估器,并试图添加原始过程。我几乎完成了,但我不知道如何添加错误。以下是我到目前为止所拥有的:
(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")),但它显然不起作用.我该怎么做?
谢谢!
发布于 2020-02-04 22:27:12
与其他原语相同,您只需将其添加如下:
(list 'error error)发布于 2020-02-09 08:59:36
当您取得更多进展时,您将学习如何捕获目标语言中的错误,而无需使用来自源语言的error。
这可以使用一些概念来完成,比如monads、当前延续、连续传递方式、使用shift/reset的控制等等。
发布于 2020-02-06 11:16:33
与其他原语没有什么区别。
(define primitive-procedures
(list (list 'car car)
...
(list '> >)
(list 'error error)))与所有其他方法一样,在底层实现中检查了该一致性。这意味着你需要提供一个论据。(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,但是如果您正在做一个更多的数据驱动程序版本的解释器,那么稍后给它起一个名称会有帮助,因为此时它与>一样被对待。
https://stackoverflow.com/questions/60065975
复制相似问题