What about hash tables ?

  | Val_table of (value, value) Hashtbl.t

If you have caml closures in your values (not in Val_closure but in Val_primitive), it is maybe not appropriate to use the default hash function that would choke on them. You should rather define your own hashing function --but defining a mutually recursive `value` type and Hashtable.make application will be delicate -- or change your representation of primitives to avoid ocaml functions (by reifying them into a concrete datatype for example).

On Tue, Oct 18, 2011 at 1:12 AM, Diego Olivier Fernandez Pons <dofp.ocaml@gmail.com> wrote:
     Caml-list,

I have to write an interpreter for a language that has arrays explicitly indexed by anything that can be sequential (list, range, set)

    {string} airports = {"ATL", "JFK"};
    range index = 1 .. 2;
    tuple recordAirport { airport : string; id : int }
    {recordAirport} otherAiports = { <"ATL", 12345>, <"JFK", 42>};

    int myArray [airports][index] = [[1, 2], [3, 4]];
    string myArray2 [a in recordAirports][i in index] = (i < a.id) ? "unknown" : a.airport ;
    int mySliceOfArray [a in recordAirports]  = sum (i in index) myArray[a.airport][i];

Usually the trick in interpreter implementation is to transform everything back to "one-dimensional" objects
- simple types
- inductive constructions for lists
- curried functions

For instance in the book "Le langage Caml" the return type of the eval function is

type value =
   | Val_number of int
   | Val_boolean of bool
   | Val_pair of value * value
   | Val_nil
   | Val_cons of value * value
   | Val_closure of closure
   | Val_primitive of value -> value
and closure = { definition: (pattern * expression) list; mutable environnement: environnement }
and environnement == (string * value) list

I don't see however how I am going to represent a type Val_Array given that the indexes can be of arbitrary type and in arbitrary number.
I haven't found either how to transform the arrays into inductive types like lists to avoid the issue.

Any suggestions ?

        Diego Olivier