在元循环求值器中添加原语
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 等概念来完成
我正在研究 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 等概念来完成