Hashtable индексируется на нескольких полях
В настоящее время я программирую модуль OCaml, определяя тип, соответствующий регистру ЦП. Интерфейс этого модуля следующий:
(*
* Defines a type which represents a R3000 register.
*)
type t =
| R0 (* Always 0 *)
| AT (* Assembler temporary *)
| V0 | V1 (* Subroutine return values *)
| A0 | A1 | A2 | A3 (* Subroutine arguments *)
| T0 | T1 | T2 | T3 | T4 | T5 | T6 | T7 (* Temporary registers *)
| S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 (* Register variables *)
| T8 | T9 (* Temporary registers *)
| K0 | K1 (* Reserved for kernels *)
| GP | SP | FP (* Global/Stack/Frame pointer *)
| RA (* Return address *)
(*
* Conversion from/to [|0, 31|].
*)
val of_int : int -> t
val to_int : t -> int
(*
* Conversion to string for display.
*)
val of_string : string -> t
val to_string : t -> string
Однако я бы хотел, чтобы реализация была быстрой и не слишком повторяющейся. Например, я мог бы написать функцию of_int следующим образом:
let of_int = function
| 0 -> R0
| 1 -> AT
(* ... *)
Но это было бы ужасно и неосуществимо. Я не хочу делать это, поскольку это противоречит моей религии программирования. Более того, мне нужно было бы делать этот вид грязного кода не только один раз, но и для четырех функций.
Первое решение, которое я нашел, было бы использовать препроцессор (Camlp4 или cpp) для генерации кода, который я хочу. Я считаю, что это излишне, но я бы использовал этот метод, если вы можетеПомоги мне с моей второй идеей.
Подумав немного, я подумал, что смогу сделать что-то вроде этого:
type regdescr = {
reg : t ;
name : string ;
index : int
}
let regs =
let htbl = Hashtbl.create 32 in
let li = [ (* regdescr defs here *) ] in
List.iter (Hashtbl.add htbl) li ;
htbl
Однако в этом случае я должен выбрать, какое поле я хочу хэшировать. Есть ли другое решение, чем использование трех разных хеш-таблиц в этом случае? Возможно, структура данных, о которой я не знаю, может хэшировать три поля и выполнять поиск по трем из них.
Извините за длинный вопрос, ответ на который может быть тривиальным :).