首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在元评价器中添加原语

在元评价器中添加原语
EN

Stack Overflow用户
提问于 2020-02-04 21:45:45
回答 3查看 354关注 0票数 0

我正在研究元级评估器,并试图添加原始过程。我几乎完成了,但我不知道如何添加错误。以下是我到目前为止所拥有的:

代码语言:javascript
复制
(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")),但它显然不起作用.我该怎么做?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-04 22:27:12

与其他原语相同,您只需将其添加如下:

代码语言:javascript
复制
(list 'error error)
票数 3
EN

Stack Overflow用户

发布于 2020-02-09 08:59:36

当您取得更多进展时,您将学习如何捕获目标语言中的错误,而无需使用来自源语言的error

这可以使用一些概念来完成,比如monads、当前延续、连续传递方式、使用shift/reset的控制等等。

票数 2
EN

Stack Overflow用户

发布于 2020-02-06 11:16:33

与其他原语没有什么区别。

代码语言:javascript
复制
 (define primitive-procedures
  (list (list 'car car)
        ...
        (list '> >)
        (list 'error error)))

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

代码语言:javascript
复制
 (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,但是如果您正在做一个更多的数据驱动程序版本的解释器,那么稍后给它起一个名称会有帮助,因为此时它与>一样被对待。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60065975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档