Sussman and Steele | December 22, 1975 | 30 | Implementation of the Interpreter |
The following declarations and macros are present only to make the compiler happy, and to make the version number of the SCHEME implementation available in the global variable VERSION
.
(DECLARE (SPECIAL **EXP** **UNEVLIS** **ENV** **EVLIS** **PC** **CLINK** **VAL** **TEM** **TOP** **QUEUE** **TICK** **PROCESS** **QUANTUM** VERSION LISPVERSION)) (DEFUN VERSION MACRO (X) (COND (COMPILER-STATE (LIST 'QUOTE (STATUS UREAD))) (T (RPLACA X 'QUOTE) (RPLACD X (LIST VERSION)) (LIST 'QUOTE VERSION)))) (DECLARE (READ)) (SETQ VERSION ((LAMBDA (COMPILER-STATE) (VERSION)) T))
The function SCHEME
initializes the system driver. The two SETQ
's merely set up version numbers. The top level loop itself is written in SCHEME, and is a LABELS
which binds the function **TOP**
to be a read-eval-print loop. The LISP global variable **TOP**
is initialized to the closure of the **TOP**
function for convenience and accessibility to user-defined functions.
(DEFUN SCHEME () (SETQ VERSION (VERSION) LISPVERSION (STATUS LISPVERSION)) (TERPRI) (PRINC '|This is SCHEME |) (PRINC VERSION) (PRINC '| running in LISP |) (PRINC LISPVERSION) (SETQ **ENV** NIL **QUEUE** NIL **PROCESS** (CREATE!PROCESS '(**TOP** '|SCHEME -- Toplevel|))) (SWAPINPROCESS) (ALARMCLOCK 'RUNTIME **QUANTUM**) (MLOOP)) (SETQ **TOP** '(BETA (LAMBDA (**MESSAGE**) (LABELS ((**TOP1** (LAMBDA (**IGNORE1** **IGNORE2** **IGNORE3**) (**TOP1** (TERPRI) (PRINC '|==> |) (PRINT (SET '* (EVALUATE (READ)))))))) (**TOP1** (TERPRI) (PRINC **MESSAGE**) NIL))) NIL))
When the LISP alarmclock tick occurs, the global register **TICK**
is set to T
. **QUANTUM**
, the amount of runtime between ticks, is measured in