Sussman and Steele | December 22, 1975 | 37 | Implementation of the Interpreter |
(DEFPROP LABELS LABELS AINT) (DEFUN LABELS () (SETQ **TEM** (MAPCAR '(LAMBDA (DEF) (LIST (CAR DEF) (LIST 'BETA (CADR DEF) NIL))) (CADR **EXP**))) (MAPC '(LAMBDA (VC) (RPLACA (CDDADR VC) **TEM**)) **TEM**) (SETQ **ENV** (NCONC **TEM** **ENV**) **EXP** (CADDR **EXP**) **PC** 'AEVAL))
We now come to the multiprocess primitives.
CREATE!PROCESS
temporarily creates a new set of machine registers (by the lambda-binding mechanism of the host language), establishes the new process in those registers, swaps it out, and returns the new process id; returning causes the old machine registers to be restored.
(DEFUN CREATE!PROCESS (EXP) ((LAMBDA (**PROCESS** **EXP** **ENV** **UNEVLIS** **EVLIS** **PC** **CLINK** **VAL**) (SWAPOUTPROCESS) **PROCESS**) (GENSYM) EXP **ENV** NIL NIL 'AEVAL (LIST NIL NIL NIL NIL 'TERMINATE NIL) NIL)) (DEFUN START!PROCESS (P) (COND ((OR (NOT (ATOM P)) (NOT (GET P 'CLINK))) (ERROR '|BAD PROCESS -- START!PROCESS| **EXP** 'FAIL-ACT))) (OR (EQ P **PROCESS**) (MEMQ P **QUEUE**) (SETQ **QUEUE** (NCONC **QUEUE** (LIST P)))) P) (DEFUN STOP!PROCESS (P) (COND ((MEMQ P **QUEUE**) (SETQ **QUEUE** (DELQ P **QUEUE**))) ((EQ P **PROCESS**) (TERMINATE))) P)
TERMINATE
is an internal microcode routine which terminates the current process. If the current process is the only one, then all processes have been stopped, and so a new SCHEME top level is created; otherwise TERMINATE
pulls the next process off the scheduler queue and swaps it in. Note that we cannot use SWAPINPROCESS
because a RESTORE
will happen in EVLIS
as soon as TERMINATE
completes (this is a very deep global property of the interpreter, and a fine