DIRECTORY RussellRuntime USING [ RTValue, RTTuple, ConsRTNode, BindingRTNode, RTCodeBody, RTClosure, ClosureRTNode, RTLocation] ; RussellRuntimeImpl: CEDAR PROGRAM EXPORTS RussellRuntime = BEGIN OPEN RussellRuntime ; RTError: PUBLIC ERROR[ec: ATOM] = CODE; MkTuple: PUBLIC PROCEDURE [name: ATOM, value: RTValue] RETURNS [RTTuple] = BEGIN RETURN[ NEW[BindingRTNode _ [name~name, value~value]]] END; ConcatTuple: PUBLIC PROCEDURE [tuple1,tuple2: RTValue] RETURNS [RTTuple] = BEGIN RETURN[ NEW[ConsRTNode _ [leftPart~tuple1,rightPart~tuple2]]] END; SelectFromTuple: PUBLIC PROCEDURE [tuple: RTValue, name: ATOM] RETURNS [RTValue] = BEGIN answer: RTValue _ NIL; DoSelection: PROCEDURE [t: RTTuple] RETURNS[ BOOL ] = BEGIN p: RTTuple _ t; nextp: RTTuple _ NIL; DO IF p = NIL THEN BEGIN IF nextp = NIL THEN RETURN[ FALSE ]; p _ nextp; nextp _ NIL END ; WITH p SELECT FROM pb: REF BindingRTNode => BEGIN IF pb.name = name THEN BEGIN answer _ pb.value; RETURN[ TRUE ] END ELSE BEGIN p _ NIL END END ; pc: REF ConsRTNode => SELECT TRUE FROM nextp = NIL => BEGIN p _ pc.leftPart; nextp _ pc.rightPart END ; pc.rightPart = NIL => p _ pc.leftPart ; pc.leftPart = NIL => p _ pc.rightPart ; ENDCASE => BEGIN IF DoSelection[pc.leftPart] THEN RETURN[ TRUE ] ; p _ pc.rightPart END ; ENDCASE => RETURN[ FALSE ] ; ENDLOOP END ; -- DoSelection IF DoSelection[ NARROW[tuple] ] THEN RETURN[ answer ] ELSE ERROR RTError[ec~$badTuple] ; END ; -- SelectFromTuple QueryTuple: PUBLIC PROCEDURE [tuple: RTValue, name: ATOM] RETURNS [BOOL] = BEGIN DoQuery: PROCEDURE [t: RTTuple] RETURNS[ BOOL ] = BEGIN p: RTTuple _ t; nextp: RTTuple _ NIL; DO IF p = NIL THEN BEGIN IF nextp = NIL THEN RETURN[ FALSE ]; p _ nextp; nextp _ NIL END ; WITH p SELECT FROM pb: REF BindingRTNode => BEGIN IF pb.name = name THEN RETURN[ TRUE ] ELSE p _ NIL END ; pc: REF ConsRTNode => SELECT TRUE FROM nextp = NIL => BEGIN p _ pc.leftPart; nextp _ pc.rightPart END ; pc.rightPart = NIL => p _ pc.leftPart ; pc.leftPart = NIL => p _ pc.rightPart ; ENDCASE => BEGIN IF DoQuery[pc.leftPart] THEN RETURN[ TRUE ] ; p _ pc.rightPart END ; ENDCASE => RETURN[ FALSE ] ; ENDLOOP END ; -- DoQuery RETURN[ DoQuery[ NARROW[tuple] ] ] END ; -- QueryTuple MkClosure: PUBLIC PROCEDURE [ep: RTValue, ip: REF ANY, cb: RTCodeBody] RETURNS [RTClosure] = BEGIN RETURN[ NEW[ ClosureRTNode _ [ep~NARROW[ep], ip~ip, cb~cb] ]] END ; -- MkClosure ApplyClosure: PUBLIC PROCEDURE [closure: RTValue, arg: RTValue ] RETURNS [RTValue] = BEGIN WITH closure SELECT FROM c: RTClosure => RETURN[ c.cb[ env~c.ep, arg~arg, ip~c.ip ] ] ; ENDCASE => ERROR RTError[ec~$badClosure] ; END ; -- ApplyClosure PrependValue: PUBLIC PROCEDURE [tuple: RTTuple, name: ATOM, value: RTValue] RETURNS[RTTuple] = BEGIN RETURN[ ConcatTuple[ MkTuple[name~name,value~value], tuple ]] END ; -- PrependValue PrependProc: PUBLIC PROCEDURE [tuple: RTTuple, name: ATOM, body: RTCodeBody] RETURNS[RTTuple] = BEGIN RETURN[ ConcatTuple[ MkTuple[name~name, value~MkClosure[ep~NIL, ip~NIL, cb~body]], tuple ] ] END ; -- PrependProc ValueOf: PUBLIC PROCEDURE [location: RTValue] RETURNS [RTValue] = BEGIN WITH location SELECT FROM loc: RTLocation => RETURN[ loc^ ] ; ENDCASE => ERROR RTError[ec~$badLocation] ; END ; -- ValueOf Assign: PUBLIC PROCEDURE [location: RTValue, value: RTValue] RETURNS [RTValue] = BEGIN WITH location SELECT FROM loc: RTLocation => RETURN[ (loc^ _ value) ] ; ENDCASE => ERROR RTError[ec~$badLocation] ; END ; -- Assign New: PUBLIC PROCEDURE [] RETURNS [RTLocation] = BEGIN RETURN[ NEW[ RTValue _ NIL ] ] END ; -- New END . ZRussellRuntimeImpl.mesa This is a simple runtime environment for Russell execution. Last Edited by: Demers, March 9, 1984 12:37:21 pm PST Errors Environments and tuples. Lookup name in tuple. Guaranteed to find the leftmost match, so replacement can be simulated by concatentation. This procedure is unnecessarily complicated but is more efficient than the straightforward recursive procedure -- it does not perform any recursive calls on right-linear lists. Invariant: Subtrees below p, nextp contain exactly all the unconsidered nodes in left-to-right order. ASSERT: p # NIL Look for name in tuple. This procedure is similar to DoSelection, above. Invariant: Subtrees below p, nextp contain exactly all the unconsidered nodes in left-to-right order. ASSERT: p # NIL Procedure Closures Procedures for manipulating environments. Variables and store. ΚΚ– "Cedar" style˜head1™Ibodyšœ;™;L™5Icode˜unitšΟk ˜ Mšœœc˜w—šΟnœœ˜!Mšœ˜š˜š˜Mšœ˜M˜—™Mš œ œœœœ˜'—™šžœœœœ ˜Hšœ˜Mšœœ+˜6Mš˜——šž œœœ ˜Hšœ˜Mšœœ2˜=Mš˜——š žœœ œœœ ˜Pšœ˜Mšœœ˜šž œ œœœ˜3M™‘M™ešœ˜Mšœ˜Mšœœ˜š˜šœœ˜Mš œ œœœœ˜$Mšœ˜Mš˜—M™šœœ˜šœœ˜šœ˜š ˜ Mšœ˜Mšœœ˜Mš˜—šœ˜ Mšœ˜Mš˜——Mšœ˜—šœœ˜&šœœ˜M˜M˜Mš˜—šœœ˜M˜—šœœ˜M˜—šœ˜Mšœœœœ˜1M˜Mš˜——šœ˜ Mšœœ˜——Mš˜—MšœΟc˜——šœœ ˜Mšœœ ˜Mšœœ˜"—MšœŸ˜——š ž œœ œœœœ˜Hšœ˜šžœ œœœ˜/M™IM™ešœ˜Mšœ˜Mšœœ˜š˜šœœ˜Mšœ œœ˜$Mšœ˜Mš˜—M™šœœ˜šœœ˜šœ˜Mš˜Mšœ˜ —Mšœ˜—šœœ˜&šœœ˜M˜M˜Mš˜—šœœ˜M˜—šœœ˜M˜—šœ˜Mšœœœœ˜-M˜Mš˜——šœ˜ Mšœœ˜——Mš˜—MšœŸ ˜——Nšœ œ ˜"MšœŸ ˜———™š ž œœ œœœœ ˜Zšœ˜Mšœœœ˜=MšœŸ ˜——šž œœ#œ ˜Ršœ˜šœ œ˜šœ˜Mšœ(˜.—šœ˜ Mšœ˜——MšœŸ˜———™)šž œœœœ ˜\šœ˜Mšœ7˜=MšœŸ˜——šž œœœœ ˜]šœ˜šœ˜šœ ˜ Mšœ&œœ ˜>Mšœ˜—Mšœ˜—MšœŸ˜———N™šžœœœ ˜?šœ˜šœ œ˜šœ˜Mšœ ˜—šœ˜ Mšœ˜ ——MšœŸ ˜——šžœœ%œ ˜Nšœ˜šœ œ˜šœ˜Mšœ˜—šœ˜ Mšœ˜ ——MšœŸ ˜——šžœœ œœ ˜-šœ˜Mšœœ œ˜MšœŸ˜ ——Nšœ˜————…— Τψ