GENERIC INTERFACEVector (R);
Arithmetic for Modula-3, see doc for detailsAbstract: Vector math
FROM Arithmetic IMPORT Error; CONST Brand = R.Brand & "Vector"; TYPE (* text form: "V6{a0,a1,a2,a3,a4,a5}" *) TBody = ARRAY OF R.T; T = REF TBody; TVBody = ARRAY OF T; PROCEDURE New (n: CARDINAL; ): T; (* make new vector with n components *) PROCEDURE NewZero (n: CARDINAL; ): T; (* make new zero vector with n components *) PROCEDURE NewUniform (n: CARDINAL; x: R.T; ): T; (* vector with all components set to x *) <* INLINE *> PROCEDURE FromArray (READONLY x: TBody; ): T; PROCEDURE FromVectorArray (READONLY x: TVBody; ): T; <* INLINE *> PROCEDURE FromScalar (x: R.T; ): T; <* INLINE *> PROCEDURE Copy (x: T; ): T; <* INLINE *> PROCEDURE Reverse (x: T; ): T; (* reverse the order of the components *) <* INLINE *> PROCEDURE IsZero (x: T; ): BOOLEAN; <* INLINE *> PROCEDURE Equal (x, y: T; ): BOOLEAN; (* x=y *) <* INLINE *> PROCEDURE Add (x, y: T; ): T; (* x+y *) <* INLINE *> PROCEDURE Sub (x, y: T; ): T; (* x-y *) <* INLINE *> PROCEDURE Neg (x: T; ): T; (* -x *) <* INLINE *> PROCEDURE Scale (x: T; y: R.T; ): T; (* x:=x*factor *) <* INLINE *> PROCEDURE Inner (x, y: T; ): R.T; (* <x,y> *) <* INLINE *> PROCEDURE Dot (x, y: T; ): R.T; (* x^T*y *)should be generalized to finding an orthonormal basis of the space orthogonal to a given set of vectors
PROCEDURE Cross(x,y:T;):T ; (* x x y
*) TYPE ApplyFtn = PROCEDURE (x: R.T; ) RAISES {Error}; MapFtn = PROCEDURE (x: R.T; ): R.T RAISES {Error}; ReduceFtn = PROCEDURE (x, y: R.T; ): R.T RAISES {Error}; PROCEDURE Apply (x: T; f: ApplyFtn; ) RAISES {Error}; PROCEDURE Map (x: T; f: MapFtn; ): T RAISES {Error}; PROCEDURE Reduce (x: T; f: ReduceFtn; init: R.T; ): R.T RAISES {Error}; PROCEDURE ArithSeq (num: CARDINAL; from: R.T; by: R.T; ): T; PROCEDURE GeomSeq (num: CARDINAL; from: R.T; by: R.T; ): T; PROCEDURE RecursiveSeq (num: CARDINAL; from: R.T; by: MapFtn; ): T RAISES {Error}; END Vector.