Добавление примитивов в метациркулярный оценщик
Я работаю над метациркулярным оценщиком и пытаюсь добавить примитивные процедуры. Я почти закончил, за исключением того, что не знаю, как добавить ошибку. Вот что у меня есть на данный момент:
(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"))
из-за ошибки, но он явно не работает... Как мне это сделать?
Спасибо!
3 ответа
Это то же самое, что и с другими примитивами, вам просто нужно добавить это так:
(list 'error error)
Когда вы продвинете что-то еще, вы узнаете, как отлавливать ошибки на целевом языке, не используя error
с исходного языка.
Это можно сделать, используя такие концепции, как монады, продолжение тока, стиль передачи продолжения, управление с помощью сдвига / сброса и т. Д.
Нет никакой разницы, чем с другими примитивами.
(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)
он вызовет лямбду и вызовет (error "Metacircular Interpreter Aborted")
. Вы также можете просто поместить лямбду вprimitive-procedures
определение, но если вы выполняете версию интерпретатора с дополнительным драйвером данных, то позднее присвоение ему имени поможет в этом, поскольку в данный момент он обрабатывается так же, как >
.