JaMMathImpl.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Original version by John Warnock, February 27, 1979
Bill Paxton, December 19, 1980 9:35 AM
McGregor, September 10, 1982 11:17 am
Doug Wyatt, March 18, 1985 3:26:28 pm PST
DIRECTORY
Basics USING [BITAND, BITNOT, BITOR, BITSHIFT, BITXOR, DoubleAnd, DoubleNot, DoubleOr, DoubleShift, DoubleXor],
JaM USING [Eq, Error, Pop, PopBool, PopInt, PopReal, PushBool, PushInt, PushReal, State],
JaMPrimitives USING [],
RealFns USING [ArcTanDeg, CosDeg, Log, Power, SinDeg, SqRt];
JaMMathImpl: CEDAR PROGRAM
IMPORTS Basics, JaM, RealFns
EXPORTS JaMPrimitives
= BEGIN OPEN JaM;
ApplyAdd:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a+b];
};
ApplySub:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a-b];
};
ApplyMul:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a*b];
};
ApplyDiv:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, a/b];
};
ApplyIDiv:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, a/b];
};
ApplyNeg:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, -a];
};
ApplySin:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, RealFns.SinDeg[a]];
};
ApplyCos:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, RealFns.CosDeg[a]];
};
ApplyATan:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, RealFns.ArcTanDeg[a, b ! ANY => GOTO Fail]];
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplyExp:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, RealFns.Power[a, b ! ANY => GOTO Fail]];
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplyLog:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushReal[self, RealFns.Log[a, b ! ANY => GOTO Fail]]
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplySqRt:
PUBLIC
PROC[self: State] = {
a: REAL = PopReal[self];
PushReal[self, RealFns.SqRt[a ! ANY => GOTO Fail]]
EXITS Fail => ERROR Error[NumericOverflow];
};
ApplyEq:
PUBLIC
PROC[self: State] = {
b: REF = Pop[self];
a: REF = Pop[self];
PushBool[self, Eq[a,b]];
};
ApplyLt:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushBool[self, a<b];
};
ApplyGt:
PUBLIC
PROC[self: State] = {
b: REAL = PopReal[self];
a: REAL = PopReal[self];
PushBool[self, a>b];
};
ApplyNot:
PUBLIC
PROC[self: State] = {
a: BOOL = PopBool[self];
PushBool[self, NOT a];
};
ApplyAnd:
PUBLIC
PROC[self: State] = {
b: BOOL = PopBool[self];
a: BOOL = PopBool[self];
PushBool[self, a AND b];
};
ApplyOr:
PUBLIC
PROC[self: State] = {
b: BOOL = PopBool[self];
a: BOOL = PopBool[self];
PushBool[self, a OR b];
};
ApplyXor:
PUBLIC
PROC[self: State] = {
b: BOOL = PopBool[self];
a: BOOL = PopBool[self];
PushBool[self, a # b];
};
ApplyBitNot:
PUBLIC
PROC[self: State] = {
a: INT = PopInt[self];
PushInt[self, Basics.DoubleNot[[li[a]]].li];
};
ApplyBitAnd:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, Basics.DoubleAnd[[li[a]], [li[b]]].li];
};
ApplyBitOr:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, Basics.DoubleOr[[li[a]], [li[b]]].li];
};
ApplyBitXor:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, Basics.DoubleXor[[li[a]], [li[b]]].li];
};
ApplyBitShift:
PUBLIC
PROC[self: State] = {
b: INT = PopInt[self];
a: INT = PopInt[self];
PushInt[self, Basics.DoubleShift[[li[a]], b].li];
};
END.