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