<> <> DIRECTORY JaMFnsDefs, Polynomial; PolynomialJaM: PROGRAM IMPORTS JaMFnsDefs, Polynomial = BEGIN PopPoly: PROC RETURNS [p: Polynomial.Ref] = BEGIN d: NAT _ JaMFnsDefs.PopInteger[]; p _ Polynomial.Create[d]; FOR i:NAT IN [0..d] DO p[i] _ JaMFnsDefs.GetReal[] ENDLOOP; END; PushPoly: PROC [p: Polynomial.Ref] = BEGIN d: NAT _ Polynomial.Degree[p]; FOR i:NAT DECREASING IN [0..d] DO JaMFnsDefs.PushReal[p[i]] ENDLOOP; JaMFnsDefs.PushInteger[d]; END; PolyEval: PROC = BEGIN x: REAL _ JaMFnsDefs.GetReal[]; f: Polynomial.Ref _ PopPoly[]; JaMFnsDefs.PushReal[Polynomial.Eval[f,x]] END; PolyAdd: PROC = BEGIN g: Polynomial.Ref _ PopPoly[]; f: Polynomial.Ref _ PopPoly[]; PushPoly[Polynomial.Sum[f,g]] END; PolySub: PROC = BEGIN g: Polynomial.Ref _ PopPoly[]; f: Polynomial.Ref _ PopPoly[]; PushPoly[Polynomial.Difference[f,g]] END; PolyMul: PROC = BEGIN g: Polynomial.Ref _ PopPoly[]; f: Polynomial.Ref _ PopPoly[]; PushPoly[Polynomial.Product[f,g]] END; PolyDerivative: PROC = BEGIN f: Polynomial.Ref _ PopPoly[]; PushPoly[Polynomial.Derivative[f]] END; PolyIntegral: PROC = BEGIN f: Polynomial.Ref _ PopPoly[]; PushPoly[Polynomial.Integral[f]] END; PolyRealRoots: PROC = BEGIN f: Polynomial.Ref _ PopPoly[]; r: REF Polynomial.RealRootRec _ Polynomial.RealRoots[f]; FOR i:NAT IN [0..r.nRoots) DO JaMFnsDefs.PushReal[r[i]] ENDLOOP; JaMFnsDefs.PushInteger[r.nRoots]; END; JaMFnsDefs.Register["Polynomial.Eval"L,PolyEval]; JaMFnsDefs.Register["Polynomial.Add"L,PolyAdd]; JaMFnsDefs.Register["Polynomial.Sub"L,PolySub]; JaMFnsDefs.Register["Polynomial.Mul"L,PolyMul]; JaMFnsDefs.Register["Polynomial.Differentiate"L,PolyDerivative]; JaMFnsDefs.Register["Polynomial.Integrate"L,PolyIntegral]; JaMFnsDefs.Register["Polynomial.Roots"L,PolyRealRoots]; END.