IPBasePrimitivesImpl.mesa
Last edited by:
Doug Wyatt, April 29, 1983 1:47 pm
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.