Добавление примитивов в метациркулярный оценщик

Я работаю над метациркулярным оценщиком и пытаюсь добавить примитивные процедуры. Я почти закончил, за исключением того, что не знаю, как добавить ошибку. Вот что у меня есть на данный момент:

(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 определение, но если вы выполняете версию интерпретатора с дополнительным драйвером данных, то позднее присвоение ему имени поможет в этом, поскольку в данный момент он обрабатывается так же, как >.

Другие вопросы по тегам