Vector Test: The file vector_test.ml tests the code generation for the vector module. The VECTOR module type is defind in the the file src/vector.ml. A model implementation for n-dimensional vector over aribtrary number and tuple types is in functor 'VectorStaged' in the file src/vectoren.ml. The following instantiation is an example for creating a vector module over the floating point number type with a 2-record representation for its coordinate tuple: type module V2R = VectorStaged (Float_Real_Exact)(Record2D) Code generation for the following functions are tested in vector_test.ml: (* vector substraction a - b *) val sub : 'a vector_s -> 'a vector_s -> 'a vector_s (* vector dot product *) val dot : 'a vector_s -> 'a vector_s -> 'a N.ns (* vector length *) val length : 'a vector_s -> 'a N.ns It is instructive to describe one of the generators in details. Consider the function Gen.length in vector_test.ml which has the following code: module Gen (V : VECTOR) = [..] let length _ = .< fun a -> .~(Staged.to_code (V.length (of_atom .< a >.))) >. [..] end First, the output is a code for a function with one parameter, 'a', which is a vector of type V.vector. The code expression from 'a' is constructed by 'of_atom ..'. of_atom creates a code_expr expression with atomicity flag = true. This will help later in the desion of generating let-bindings. The resultant vector expression is passed to V.length, and the produced staged expression is converted to code before inling it. The output file vector_out.ml contains the outputs. We show here a snippet. The following two instantiations were done over float number types. The first instantiation is has a 2D pair type for storing the coordinates: module V2P = VectorStaged (Float_Real_Exact)(Pair2D) module GV2P = Gen(V2P) GV2P.length () which produces the code: - : ('a, V2P.vector -> V2P.N.n) code = .
(sqrt ( ((fst a_1) *. (fst a_1)) +. ((snd a_1) *. (snd a_1))) )>. The second instantiation is has a 3D record type for storing the coordinates: module V3R = VectorStaged (Float_Real_Exact)(Record3D) module GV3R = Gen(V3R) GV3R.length () which produces the code: - : ('a, V3R.vector -> V3R.N.n) code = . (sqrt ( (a_1.z *. a_1.z) +. ((a_1.x *. a_1.x) +. (a_1.y *. a_1.y)) ))>.