DEFINITION MODULE Machine; CONST maxLength=24; TYPE link=POINTER TO closure; handlerType=PROC; closure=POINTER TO clRec; envList=POINTER TO environment; wdPtr=POINTER TO wd; wd=RECORD def:closure; name:POINTER TO ARRAY [0..maxLength] OF CHAR END; flag=(defined, primitive, packed, string, length); clRec=RECORD CASE kind:flag OF defined: root:wdPtr; ELSE handler:handlerType END; env,valEnv:envList END; environment=RECORD name:wdPtr; newDef:closure; next:envList END; VAR result,EmptyClosure,HandlePackage,HandleParent,parent,tempDef:closure; wPackage,wPacked,wType:link; debug:BOOLEAN; PROCEDURE StartLayer; PROCEDURE SaveDefinition(dp:link); PROCEDURE NewLayer(d:closure); PROCEDURE PopLayer; PROCEDURE Keep(dp:link); PROCEDURE Reduce(from:closure); PROCEDURE Build; PROCEDURE BuildReduced; PROCEDURE Copy(from:closure; VAR to:closure); PROCEDURE Root(def:closure):link; PROCEDURE Join(VAR def:closure; description:closure); PROCEDURE MakeDef(VAR new:closure; root:link); PROCEDURE MakePrimitive(VAR new:closure; root:handlerType); PROCEDURE MakePacked(VAR d:closure; root:link; contents:ARRAY OF BYTE); PROCEDURE MakeString(VAR d:closure; root:link; start:ADDRESS); PROCEDURE AddEnv(VAR d:closure; prop:link; value:closure); PROCEDURE AddValuedEnv(VAR d:closure; prop:link; value:closure); PROCEDURE RemoveEnv(VAR d:closure; prop:link); PROCEDURE Equal(d1,d2:closure):BOOLEAN; PROCEDURE ExtractPacked(package:closure; VAR contents:ARRAY OF BYTE); PROCEDURE Envelope(VAR def:closure; struct:closure; cons,valCons,listEnd,prop,value,next:link); PROCEDURE MarkString(VAR str:ADDRESS); PROCEDURE MarkClosure(VAR d:closure); PROCEDURE MarkLink(VAR dp:link); END Machine.