<> <> <> DIRECTORY IPBasePrimitives USING [], IPBasic USING [Any, Integer, Number, Operator, State, Vector, VectorShape], IPErrors USING [MasterError], IPExec USING [FGet, FSet, MakeCO, MakeSimpleCO, Do, DoBody, DoSimpleBody, If, IfCopy], IPOps USING [Eq, EqN, Gt, Ge, Type, Add, Sub, Neg, Abs, Floor, Ceiling, Trunc, Round, Mul, Div, Mod, Rem], IPStack USING [PopAny, PopBool, PopInteger, PopNumber, PopOperator, PopVector, PushAny, PushBool, PushInteger, PushNumber, PushOperator, PushVector, Copy, Roll, Mark, Unmark, Count], IPVector USING [Get, MakeVecLU, MakeVec, Shape, GetProp, MergeProp]; IPBasePrimitivesImpl: CEDAR PROGRAM IMPORTS IPErrors, IPExec, IPOps, IPStack, IPVector EXPORTS IPBasePrimitives = BEGIN OPEN IPBasic; <<2.4.3 Vector operators>> ApplyGET: PUBLIC PROC[self: State] = { n: Integer = IPStack.PopInteger[self]; v: Vector = IPStack.PopVector[self]; x: Any = IPVector.Get[v, n]; IPStack.PushAny[self, x]; }; ApplyMAKEVECLU: PUBLIC PROC[self: State] = { u: Integer = IPStack.PopInteger[self]; l: Integer = IPStack.PopInteger[self]; v: Vector = IPVector.MakeVecLU[self, l, u]; IPStack.PushVector[self, v]; }; ApplyMAKEVEC: PUBLIC PROC[self: State] = { n: Integer = IPStack.PopInteger[self]; v: Vector = IPVector.MakeVec[self, n]; IPStack.PushVector[self, v]; }; ApplySHAPE: PUBLIC PROC[self: State] = { v: Vector = IPStack.PopVector[self]; shape: VectorShape = IPVector.Shape[v]; IPStack.PushInteger[self, shape.l]; IPStack.PushInteger[self, shape.n]; }; ApplyOPENVEC: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyGETPROP: PUBLIC PROC[self: State] = { propName: Any = IPStack.PopAny[self]; v: Vector = IPStack.PopVector[self]; x: Any; b: BOOL; [x, b] _ IPVector.GetProp[v, propName]; IF b THEN IPStack.PushAny[self, x]; IPStack.PushBool[self, b]; }; ApplyGETP: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyMERGEPROP: PUBLIC PROC[self: State] = { v2: Vector = IPStack.PopVector[self]; v1: Vector = IPStack.PopVector[self]; v3: Vector = IPVector.MergeProp[v1, v2]; IPStack.PushVector[self, v3]; }; <<>> <<2.4.4 Frame operators>> ApplyFGET: PUBLIC PROC[self: State] = { n: Integer = IPStack.PopInteger[self]; x: Any = IPExec.FGet[self, n]; IPStack.PushAny[self, x]; }; ApplyFSET: PUBLIC PROC[self: State] = { n: Integer = IPStack.PopInteger[self]; x: Any = IPStack.PopAny[self]; IPExec.FSet[self, x, n]; }; ApplyFRAME: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyPOOLOP: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyPOOL: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyPGET: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyPSET: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyENV: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; <<>> <<2.4.5 Operator operators>> ApplyMAKESIMPLECO: PUBLIC PROC[self: State] = { o: Operator = IPExec.MakeSimpleCO[self]; -- body operator IPStack.PushOperator[self, o]; }; ApplyMAKECO: PUBLIC PROC[self: State] = { f: Vector = IPStack.PopVector[self]; o: Operator = IPExec.MakeCO[self, f]; -- body operator IPStack.PushOperator[self, o]; }; ApplyMAKECOMPILEDIMAGE: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyMAKEPOOL: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyNOPOOL: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyDO: PUBLIC PROC[self: State] = { o: Operator = IPStack.PopOperator[self]; IPExec.Do[self, o]; }; ApplyDOSAVE: PUBLIC PROC[self: State] = { o: Operator = IPStack.PopOperator[self]; IPExec.Do[self, o, save]; }; ApplyDOSAVEALL: PUBLIC PROC[self: State] = { o: Operator = IPStack.PopOperator[self]; IPExec.Do[self, o, saveAll]; }; ApplyDOBODY: PUBLIC PROC[self: State] = { f: Vector = IPStack.PopVector[self]; IPExec.DoBody[self, f]; -- body operator }; ApplyDOSAVEBODY: PUBLIC PROC[self: State] = { f: Vector = IPStack.PopVector[self]; IPExec.DoBody[self, f, save]; -- body operator }; ApplyDOSAVEALLBODY: PUBLIC PROC[self: State] = { f: Vector = IPStack.PopVector[self]; IPExec.DoBody[self, f, saveAll]; -- body operator }; ApplyDOSAVESIMPLEBODY: PUBLIC PROC[self: State] = { IPExec.DoSimpleBody[self, save]; -- body operator }; <<>> <<2.4.6 Stack operators>> ApplyPOP: PUBLIC PROC[self: State] = { [] _ IPStack.PopAny[self]; }; ApplyCOPY: PUBLIC PROC[self: State] = { depth: Integer = IPStack.PopInteger[self]; IPStack.Copy[self, depth]; }; ApplyDUP: PUBLIC PROC[self: State] = { IPStack.Copy[self, 1]; }; ApplyROLL: PUBLIC PROC[self: State] = { moveFirst: Integer = IPStack.PopInteger[self]; depth: Integer = IPStack.PopInteger[self]; IPStack.Roll[self, depth, moveFirst]; }; ApplyEXCH: PUBLIC PROC[self: State] = { IPStack.Roll[self, 2, 1]; }; ApplyMARK: PUBLIC PROC[self: State] = { n: Integer = IPStack.PopInteger[self]; IPStack.Mark[self, n]; }; ApplyUNMARK: PUBLIC PROC[self: State] = { n: Integer = IPStack.PopInteger[self]; IPStack.Unmark[self, n]; }; ApplyUNMARK0: PUBLIC PROC[self: State] = { IPStack.Unmark[self, 0]; }; ApplyCOUNT: PUBLIC PROC[self: State] = { n: Integer = IPStack.Count[self]; IPStack.PushInteger[self, n]; }; ApplyNOP: PUBLIC PROC[self: State] = { }; <<>> <<2.4.7 Control operators>> ApplyIF: PUBLIC PROC[self: State] = { b: BOOL = IPStack.PopBool[self]; IPExec.If[self, b]; -- body operator }; ApplyIFELSE: PUBLIC PROC[self: State] = { b: BOOL = IPStack.PopBool[self]; IPExec.If[self, b]; -- body operator IPStack.PushBool[self, NOT b]; }; ApplyIFCOPY: PUBLIC PROC[self: State] = { testCopy: Operator = IPStack.PopOperator[self]; IPExec.IfCopy[self, testCopy]; -- body operator }; ApplyLOOP: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; <<>> <<2.4.8 Test operators>> ApplyEQ: PUBLIC PROC[self: State] = { b: Any = IPStack.PopAny[self]; a: Any = IPStack.PopAny[self]; c: BOOL = IPOps.Eq[a, b]; IPStack.PushBool[self, c]; }; ApplyEQN: PUBLIC PROC[self: State] = { b: Any = IPStack.PopAny[self]; a: Any = IPStack.PopAny[self]; c: BOOL = IPOps.EqN[a, b]; IPStack.PushBool[self, c]; }; ApplyGT: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: BOOL = IPOps.Gt[a, b]; IPStack.PushBool[self, c]; }; ApplyGE: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: BOOL = IPOps.Ge[a, b]; IPStack.PushBool[self, c]; }; ApplyAND: PUBLIC PROC[self: State] = { b: BOOL = IPStack.PopBool[self]; a: BOOL = IPStack.PopBool[self]; c: BOOL = a AND b; IPStack.PushBool[self, c]; }; ApplyOR: PUBLIC PROC[self: State] = { b: BOOL = IPStack.PopBool[self]; a: BOOL = IPStack.PopBool[self]; c: BOOL = a OR b; IPStack.PushBool[self, c]; }; ApplyNOT: PUBLIC PROC[self: State] = { b: BOOL = IPStack.PopBool[self]; c: BOOL = NOT b; IPStack.PushBool[self, c]; }; ApplyTYPE: PUBLIC PROC[self: State] = { a: Any = IPStack.PopAny[self]; c: Integer = IPOps.Type[a]; IPStack.PushInteger[self, c]; }; <<>> <<2.4.9 Arithmetic operators>> ApplyADD: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Add[a, b]; IPStack.PushNumber[self, c]; }; ApplySUB: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Sub[a, b]; IPStack.PushNumber[self, c]; }; ApplyNEG: PUBLIC PROC[self: State] = { a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Neg[a]; IPStack.PushNumber[self, c]; }; ApplyABS: PUBLIC PROC[self: State] = { a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Abs[a]; IPStack.PushNumber[self, c]; }; ApplyFLOOR: PUBLIC PROC[self: State] = { a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Floor[a]; IPStack.PushNumber[self, c]; }; ApplyCEILING: PUBLIC PROC[self: State] = { a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Ceiling[a]; IPStack.PushNumber[self, c]; }; ApplyTRUNC: PUBLIC PROC[self: State] = { a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Trunc[a]; IPStack.PushNumber[self, c]; }; ApplyROUND: PUBLIC PROC[self: State] = { a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Round[a]; IPStack.PushNumber[self, c]; }; ApplyMUL: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Mul[a, b]; IPStack.PushNumber[self, c]; }; ApplyDIV: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Div[a, b]; IPStack.PushNumber[self, c]; }; ApplyMOD: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Mod[a, b]; IPStack.PushNumber[self, c]; }; ApplyREM: PUBLIC PROC[self: State] = { b: Number = IPStack.PopNumber[self]; a: Number = IPStack.PopNumber[self]; c: Number = IPOps.Rem[a, b]; IPStack.PushNumber[self, c]; }; ApplyMAX: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyMIN: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplySQRT: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyEXP: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyLOG: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplySIN: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyCOS: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; ApplyATAN: PUBLIC PROC[self: State] = { ERROR IPErrors.MasterError[Unimplemented]; }; END.