Point Test: The file point_test.ml tests the code generation for the point module. The POINT module type is defind in the the file src/point.ml. A model implementation for n-dimensional point types is in functor 'En_Point' in the file src/pointen.ml. The following instantiation is an example for creating a point module over the floating point number type with a 2-record representation for its coordinate tuple: module V2R = VectorStaged (Float_Real_Exact) (Record2D) module P2R = En_Point (Float_Real_Exact) (V2R) (Record2D) The file point_test.ml, however, tests a variant of the POINT type, namely, ISO_AXIS_ORDERED_POINT which is an ordered point type with axis-oriented ordering. Code generation for the following functions are tested: (* Substract two points a - b to get a vector *) val sub : 'a point_s -> 'a point_s -> 'a V.vector_s (* Test if point a < point b *) val lt : 'a point_s -> 'a point_s -> 'a Bool.b (* Compute min(a,b) of two points a and b *) val min : 'a point_s -> 'a point_s -> 'a point_s It is instructive to describe one of the generators in details. Consider the function Gen.sub in point_test.ml which has the following code: module Gen (P : ISO_AXIS_ORDERED_POINT) = [..] let sub _ = .< fun a b -> .~(Staged.to_code (P.sub (of_atom .< a >.) (of_atom .< b >. ))) >. [..] end First, the output is a code for a function with two parameter, 'a' and 'b', both of type P.point. Two atomic code expressions are constructed from 'a' and 'b' and passed to P.sub. The resultant /vector/ expression is converted to code before inling it. The output file point_out.ml contains the outputs. We show here a snippet for the generator cmp_x defined as: (* Compare the x-coordinate of two points according to relator P.lt 0 a b which is equivalent to a <_x b *) let cmp_x _ = .< fun a b -> .~(Staged.to_code (P.lt 0 (of_atom .< a >.) (of_atom .< b >.))) >. The first instantiation is a 2D point type: module V2R = VectorStaged (Float_Real_Exact) (Record2D) module P2R = Iso_Axis_Ordered_En_Point (Float_Real_Exact) (V2R) (Record2D) module GP2R = Gen (P2R) GP2R.cmp_x () which produces the code: - : ('a, P2R.point -> P2R.point -> bool) code = .
fun b_2 -> (a_1.c0 <= b_2.c0)>. The second instantiation is has a 3D point type: module V3R = VectorStaged (Float_Real_Exact) (Record3D) module P3R = Iso_Axis_Ordered_En_Point (Float_Real_Exact) (V3R) (Record3D) module GP3R = Gen (P3R) GP3R.cmp_x () which produces the code: - : ('a, P3R.point -> P3R.point -> bool) code = . fun b_2 -> (a_1.x <= b_2.x)>.