我目前正在編程一個OCaml模塊,它定義了一個與CPU寄存器相對應的類型。這個模塊的接口如下:在幾個字段索引的Hashtable
(*
* 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
然而,在這種情況下,我必須選擇我想要什麼哈希領域。除了在這種情況下使用三個不同的哈希表有沒有另一種解決方案?也許我不知道的一個數據結構能夠對三個字段進行散列並對其中的三個進行搜索。
對不起,長問題的答案可能是微不足道的:)。
嗯,我想到了過去3小時的問題,並沒有發現任何東西比任何三個hashtbls或其他預處理技巧,所以我想我會去用哈希表。感謝您確認這不是一個壞主意。 – 2009-11-22 06:39:02