<> <> <> RussellRuntime: CEDAR DEFINITIONS = BEGIN <> RTError: ERROR[ec: ATOM _ NIL]; <> RTValue: TYPE = REF ANY; <> RTTuple: TYPE = REF ANY; emptyRTTuple: RTTuple ~ NIL; ConsRTNode: TYPE = RECORD [ leftPart, rightPart: RTTuple ]; BindingRTNode: TYPE = RECORD [ name: ATOM, value: RTValue ]; MkTuple: PROCEDURE [name: ATOM, value: RTValue] RETURNS [RTTuple] ; ConcatTuple: PROCEDURE [tuple1,tuple2: RTValue] RETURNS [RTTuple] ; SelectFromTuple: PROCEDURE [tuple: RTValue, name: ATOM] RETURNS [RTValue] ; QueryTuple: PROCEDURE [tuple: RTValue, name: ATOM] RETURNS [BOOL] ; <> RTCodeBody: TYPE = PROCEDURE[ env: RTTuple, arg: RTValue, ip: REF ANY ] RETURNS[RTValue]; RTClosure: TYPE = REF ClosureRTNode; ClosureRTNode: TYPE = RECORD [ ep: RTTuple, ip: REF ANY, cb: RTCodeBody ]; MkClosure: PROCEDURE [ep: RTValue, ip: REF ANY, cb: RTCodeBody] RETURNS [RTClosure] ; ApplyClosure: PROCEDURE [closure: RTValue, arg: RTValue ] RETURNS [RTValue] ; <> PrependValue: PROCEDURE [tuple: RTTuple, name: ATOM, value: RTValue] RETURNS[RTTuple] ; PrependProc: PROCEDURE [tuple: RTTuple, name: ATOM, body: RTCodeBody] RETURNS[RTTuple] ; <> RTLocation: TYPE = REF RTValue; ValueOf: PROCEDURE [location: RTValue] RETURNS [RTValue] ; Assign: PROCEDURE [location: RTValue, value: RTValue] RETURNS [RTValue] ; New: PROCEDURE [] RETURNS [RTLocation] ; END .