{Primitive Operators} Page 10
A primitive operator might be a very complicated object in a "real" LISP implementation; it would probably have machine-language code within it. We are not interested in the details of a particular host machine here; we wish only to present a simple meta-circular definition of PRIMOP and PRIMOP. We will notate the procedural object which is the value of CAR (say) in the initial top-level environment <THE-PRIMITIVE-PROCEDURES> as "&CAR". This object has no interesting properties except that it is EQ to itself and not to any other object. The initial top-level environment therefore looks like:
(((CAR CDR EQ ATOM NULL NUMBERP + - * ...)
&CAR &CDR &EQ &ATOM &NULL &NUMBERP &+ &- &* ...))
Given this, we can define PRIMOP and PRIMOP as in Figure N7.
(DEFINE (PRIMOP FUN)
(COND ((EQ FUN '&CAR) T)
((EQ FUN '&CDR) T)
((EQ FUN '&EQ) T)
((EQ FUN '&ATOM) T)
((EQ FUN '&NULL) T)
((EQ FUN '&NUMBERP) T)
((EQ FUN '&+) T)
((EQ FUN '&-) T)
((EQ FUN '&*) T)
...
(T NIL)))
(DEFINE (PRIMOP-APPLY FUN ARGS)
(COND ((EQ FUN '&CAR) (CAR (CAR ARGS)))
((EQ FUN '&CDR) (CDR (CAR ARGS)))
((EQ FUN '&EQ) (EQ (CAR ARGS) (CADR ARGS)))
((EQ FUN '&ATOM) (ATOM (CAR ARGS)))
((EQ FUN '&NULL) (NULL (CAR ARGS)))
((EQ FUN '&NUMBERP) (NUMBERP (CAR ARGS)))
((EQ FUN '&+) (+ (CAR ARGS) (CADR ARGS)))
((EQ FUN '&-) (- (CAR ARGS) (CADR ARGS)))
((EQ FUN '&*) (* (CAR ARGS) (CADR ARGS)))
...
(T (ERROR))))
Figure N7
Meta-Circular Definition of PRIMOP and PRIMOP-APPLY