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).
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 functionsFor instance in the book "Le langage Caml" the return type of the eval function istype 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 -> valueand closure = { definition: (pattern * expression) list; mutable environnement: environnement }and environnement == (string * value) listI 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